objective-c iphone cocoa-touch memory-management static-libraries

objective c - ¿Cómo resolver el "selector no reconocido enviado a la instancia"?



objective-c iphone (9)

En AppDelegate, estoy asignando una instancia definida en una biblioteca estática. Esta instancia tiene una propiedad NSString configurada como "copia". Cuando accedo a la propiedad de cadena en esta instancia, la aplicación falla con ''selector no reconocido enviado a instancia''. Xcode proporciona una sugerencia de código para la propiedad, lo que significa que se conoce en la aplicación de llamada. La clase particular se compila en el objetivo de la biblioteca estática. ¿Qué me estoy perdiendo?

Agregar un código

//static library //ClassA.h @interface ClassA : NSObject { ... NSString *downloadUrl; } @property(nonatomic, copy) NSString *downloadUrl; //ClassA.m @synthesize downloadUrl;

En la aplicación de la aplicación que llamaDelegate.

//app delegate header file @interface myApp : NSObject <UIApplicationDelegate> { ClassA *classA; } @property (nonatomic, retain) ClassA *classA; //app delegate .m file @synthesize classA; - (void)applicationDidFinishLaunching:(UIApplication *)application { classA = [[ClassA alloc] init]; //exception occurs here. downloadUrl is of type NSCFNumber classA.downloadUrl = @"http://www.abc.com/"; ...}

Otras clases en la aplicación obtendrán una referencia al delegado y llamarán a classA.downloadUrl.


¿Cómo está importando ClassA en su clase de AppDelegate? ¿Incluyó el archivo .h en el proyecto principal? Tuve este problema por un tiempo porque no copié el archivo de encabezado en el proyecto principal, así como el #include normal "ClassA.h".

Copiar o crear el .h lo resolvió por mí.


1) ¿Se sintetiza dentro del bloque @implementation ?

2) ¿Debería referirse a self.classA = [[ClassA alloc] init]; y self.classA.downloadUrl = @"..." lugar de simple classA ?

3) En su archivo myApp.m , ¿necesita importar ClassA.h , cuando falta, tendrá un número predeterminado o un puntero? (en C las variables son predeterminadas a int si el compilador no las encuentra):

#import "ClassA.h" .


Debe tener en cuenta que este no es necesariamente el mejor patrón de diseño. Por lo que se ve, esencialmente estás usando tu delegado de aplicaciones para almacenar lo que equivale a una variable global.

Matt Gallagher cubrió bien el tema de los globales en su artículo Cocoa with Love en http://cocoawithlove.com/2008/11/singletons-appdelegates-and-top-level.html . Probablemente, su ClassA debería ser un singleton en lugar de un global en AppDelegate, aunque es posible que intente que ClassA sea más general y no simplemente singleton. En ese caso, probablemente sea mejor con un método de clase para devolver una instancia preconfigurada de Clase A, algo así como:

+ (ClassA*) applicationClassA { static ClassA* appClassA = nil; if ( !appClassA ) { appClassA = [[ClassA alloc] init]; appClassA.downloadURL = @"http://www.abc.com/"; } return appClassA; }

O alternativamente (dado que eso agregaría cosas específicas de la aplicación a lo que posiblemente sea una clase de propósito general), crea una nueva clase cuyo único propósito es contener ese método de clase.

El punto es que las aplicaciones globales no necesitan ser parte de AppDelegate. El hecho de que AppDelegate sea un singleton conocido, no significa que todas las demás aplicaciones globales se mezclen con él, incluso si no tienen nada que ver conceptualmente con el manejo de los métodos delegados de NSApplication.


El mío fue algo simple / estúpido. Error de principiante, para cualquiera que haya convertido su NSManagedObject a un NSObject normal.

Tuve:

@dynamic order_id;

cuando debería haber tenido:

@synthesize order_id;


En el código que publicaste, estás enviando setDownloadURL: setter a ClassA , es decir, a la clase misma . Desea establecer la propiedad de una instancia.


Establezca el indicador -ObjC en Otro marcador de enlazador en su configuración de Proyecto ... (No en el proyecto de biblioteca estática pero el proyecto que está utilizando la biblioteca estática ...) Y asegúrese de que en Configuración del proyecto la Configuración esté configurada como Toda configuración


Mucha gente ha dado respuestas muy técnicas para esta y otras preguntas similares, pero creo que es más simple que eso. Algunas veces, si no está prestando atención, un selector que no tiene la intención de usar se puede adjuntar a algo en la interfaz. Es posible que esté recibiendo este error porque el selector está allí pero no ha escrito ningún código para él.

La forma más fácil de verificar que este no es el caso es presionando la tecla control para que pueda ver todos los selectores asociados. Si hay algo allí que no quieres ser, ¡deshazte de él! Espero que esto ayude...


Muy extraño, pero. Debe declarar la clase para su instancia de aplicación como myApplication: UIApplication en lugar de myApplication: NSObject. Parece que el protocolo UIApplicationDelegate no implementa el mensaje + registerForSystemEvents. Crazy Apple APIs, de nuevo.


Para mí, lo que causó este error fue que accidentalmente tuve el mismo mensaje enviado dos veces al mismo miembro de la clase. Cuando hice clic derecho en el botón de la interfaz gráfica de usuario, pude ver el nombre del método dos veces, y acabo de eliminar uno. Error de principiante en mi caso, pero quería sacarlo para que otros novatos lo tengan en cuenta.