2012-04-26 12 views
9

que tienen una referencia de clase se define en una de las clases se trabaja con:iPhone iOS cómo comparar el objeto de clase a otro objeto de clase?

Class _objectClass; 

    if([self.objectClass isSubclassOfClass:[NSManagedObject class]]) 
     { 
      //does not get called 
     } 

¿Cómo puedo comprobar qué tipo de Class estoy tratando?

ACTUALIZACIÓN: perdón autocompletar no me mostró que esKindOfClass: estaba disponible. Estoy probando ahora que

+2

Quizás esté buscando el método '-isKindOfClass:': https://developer.apple.com/library/mac/# documentation/Cocoa/Reference/Foundation/Protocols/NSObject_Protocol/Reference/NSObject.html –

+0

Para mayor claridad en mi respuesta a continuación ... ¿qué es objectClass? ¿Es ese el nombre de una clase real? Una instancia de una clase? Por favor, no que la semántica sugiera que las clases se nombren con mayúscula primero y las instancias con minúscula. Entonces, MyClass es una clase, y instanceOfMyClass es una instancia de MyClass. – jmstone617

+0

Clase _objectClass es un tipo de referencia de objeto de clase que RestKit está utilizando para instanciar sus instancias de objeto. –

Respuesta

27

Hay dos métodos que le interesan:

isKindOfClass: pide al receptor si se trata de una clase o una subclase , donde como isMemberOfClass: pide al receptor si se trata de la clase , pero no es una subclase. Por ejemplo, supongamos que tiene su subclase NSManagedObject llamada objectClass.

if([self.objectClass isKindOfClass:[NSManagedObject class]]) { 
    // This will return YES 
} 
else if ([self.objectClass isMemberOfClass:[NSManagedObject class]]) { 
    // This will return NO 
} 

La primera instrucción devuelve Sí (o verdadero, o 1) porque objectClass es una subclase de NSManagedObject. La segunda declaración devuelve NO (o falso, o 0) porque, aunque es una subclase, no es la clase misma.

ACTUALIZACIÓN: me gustaría actualizar esta respuesta para llevar la luz a un comentario más abajo, que establece que esta explicación es incorrecta porque la siguiente línea de código:

if ([self.class isKindOfClass:self.class]) 

volvería falsa . Esto es correcto, devolvería falso. Pero este ejemplo es incorrecto Cada clase que hereda de NSObject también se ajusta al protocolo NSObject. Dentro de este protocolo hay un método llamado class que "devuelve el objeto de clase para la clase del receptor". En este caso, self.class devuelve cualquier objeto de clase self. Sin embargo, a partir de la documentación sobre isKindOfClass: -

devuelve un valor booleano que indica si el receptor es un instancia de la clase dada o una instancia de cualquier clase que hereda de esa clase.

por lo tanto, el envío de este mensaje a self.class (que es una clase) devuelve falso, ya que está destinado a ser enviado a una instancia de una clase, no a una clase en sí.

Si cambia el ejemplo a

if([self isKindOfClass:self.class]) 

Usted recibirá Sí (o verdadero, o 1).

Mi respuesta aquí supone que self.objectClass es un descriptor de acceso a una instancia llamada objectClass. Claro, es un nombre terrible para una instancia de una clase, pero la pregunta no era "¿cómo puedo nombrar instancias de clases?".

+0

La combinación de los dos como arriba no lo lograría. Necesitaría isKindOfClass: [NSManagedObject class] && isMemberOfClass: [ObjectClass class], suponiendo que self.objectClass es una instancia de la clase llamada ObjectClass. – jmstone617

+1

Claro. Más de una manera de despellejar a un gato. O programa uno, para el caso :) – jmstone617

+0

Tu explicación es incorrecta. Por ejemplo, '[self.class isKindOfClass: self.class]' devolvería 'NO', lo cual contradice lo que está explicando. El 'isKindOfClass' se usa para verificar la clase de la instancia, no la clase en sí misma. – tia

1

Sí, [self.objectClass isSubclassOfClass:[NSManagedObject class]] es correcto. Si es falso, significa que la clase representada por self.objectClass no es una subclase de NSManagedObject. No entiendo cuál es tu problema o lo que estás esperando.

Cuestiones relacionadas