El tipo de propiedad no coincide con el tipo de acceso

Usando Xcode 6 Beta 4, apuntando a iOS 8:

Estoy usando Core Data y Mogenerator juntos. Si no está familiarizado con "Mogen", salte al final. Cuando Mogen genera una subclass NSManagedObject para una entidad, hace esto:

@interface MyEntityID : NSManagedObjectID {} @end @interface _MyEntity : NSManagedObject {} - (MyEntityID*)objectID; ---------------------------------------------------------------------------- @implementation _MyEntity - (KJMWorkoutID*)objectID { return (KJMWorkoutID*)[super objectID]; } 

Es un poco útil, supongo. NSManagedObject tiene una propiedad objectID, todo lo que _MyEntity está haciendo es anular su getter para devolver un MyEntityID para que podamos decir que es una ID específicamente para nuestro _MyEntityClass.

Entonces, de vuelta a mi pregunta. Quiero comparar dos MyEntityIDs al comprobar que no son iguales:

 if (![self.objectID isEqual:self.previousID]) 

Recibo esta advertencia:

Type of property 'objectID' does not match type of accessor 'objectID'

Bien, entiendo que la propiedad es NSManagedObjectID, pero estamos llamando al método de acceso que Mogen ha escrito que devuelve MyEnytityID. Incluso la finalización del código lo reconoce.

¿Cómo sigue viendo el tipo de propiedad NSManagedObjectID para objectID de NSManagedObject? ¿Debo silenciar la advertencia de alguna manera? ¿Es probable que sea solo una cosa de Xcode 6 Beta? (no sucede en Xcode 5)

¿Qué es Mogen?

Mogen es solo una herramienta útil que genera subclasss de NSManagedObject para sus entidades de model de datos. Es como lo que hace Xcode, pero no borra ningún código personalizado que escriba cada vez que vuelva a generar las subclasss y le proporciona un montón de buenos methods para usar para crear nuevas entidades, etc. Si la class prefijada de la barra inferior Por cierto, también hay algo nuevo para ti, es solo la forma en que Mogen se detiene a sí misma al sobreescribir cualquier código personalizado que escriba.

El problema no está relacionado con la versión Xcode 6 beta, pero debido al hecho de que la statement de objectID cambió en iOS 8. Hasta iOS 7, se declaró como un método de instancia :

 - (NSManagedObjectID *)objectID; 

A partir de iOS 8 / OS X 10.10, se declara como una propiedad de solo lectura:

 @property (nonatomic, readonly, strong) NSManagedObjectID *objectID; 

Como se explica en https://stackoverflow.com/a/7086119/1187415 , puede anular un método de instancia en una subclass con un método que tenga un valor de retorno más especializado, en este caso

 - (MyEntityID *)objectID; 

Pero parece problemático anular una propiedad con un valor de retorno más especializado (y hacerlo causaría la advertencia idéntica con Xcode 5).

Lo siguiente parece funcionar con los SDK "antiguos" y los "nuevos": en "_MyEntity.h", reemplace

 - (MyEntityID*)objectID; 

por

 @property (nonatomic, readonly, strong) MyEntityID *objectID; 

y en "_MyEntity.m", elimine el método de - (MyEntityID*)objectID y agregue

 @dynamic objectID; 

Sin embargo, estos files siempre son recreados por Mogenerator, así que esta no es una solución satisfactoria. Recomendaría presentar un informe de error a las personas de Mogenerator para encontrar una solución que sea compatible con los SDK de iOS 8 / OS X 10.10.

No pude encontrar una opción de comstackdor para suprimir esta advertencia (no está marcada con "-W …" para que una opción "-Wno …" la suprimiera.

Como solución alternativa , puede replace self.objectID por [self objectID] , que no provoca la advertencia.

La respuesta de @Martin R es correcta, pero para los que llegan aquí de ahora en adelante, Mogenerator se ha actualizado a v1.28 y corrige este problema.