Pregunta

En el AppDelegate, estoy alloc ing una instancia definida en una biblioteca estática.Esta instancia tiene un NSString conjunto de propiedades de una "copia".Cuando puedo acceder a la propiedad de la cadena en este caso, la aplicación se bloquea con 'no reconocido selector enviado a la instancia".Xcode ofrece una sugerencia para el código de la propiedad, lo que significa que es conocido en la aplicación de llamadas.La clase particular es compilado en la estática de la biblioteca de destino.Lo que me estoy perdiendo?

Agregar algo de 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 llamadas del appDelegate.

//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 va a obtener una referencia al delegado y llame a classA.downloadUrl.

¿Fue útil?

Solución

1) Es la de sintetizar dentro de @implementation bloque?

2) en caso de que se refieren a self.classA = [[ClassA alloc] init]; y self.classA.downloadUrl = @"..." en lugar de la llanura classA?

3) En su myApp.m archivo que usted necesita para importar ClassA.h, cuando faltan, se usará un número, o un puntero?(en C las variables por defecto int si no se encuentra por el compilador):

#import "ClassA.h".

Otros consejos

bandera Conjunto -ObjC en varios Flag enlazador en su entorno Proyecto ... (No en el proyecto de la biblioteca estática pero el proyecto en el que que se utiliza biblioteca estática ...) Y asegúrese de que en configuración del entorno del proyecto se define en Todas configuración

Una gran cantidad de personas se han dado algunas respuestas muy técnico para esta y otras preguntas similares, pero creo que es más simple que eso. A veces, si usted no está prestando la atención un selector que no tiene intención de usar se puede conectar a algo en la interfaz. Usted puede estar recibiendo este error porque el selector está ahí, pero usted no ha escrito ningún código para ello.

La forma más fácil volver a revisar que este no es el caso es controlar clic en el elemento para que pueda ver todos los selectores que se asocian con él. Si hay algo ahí que no quiere ser, deshacerse de él! Esperamos que esto ayude ...

En el código que envió, va a enviar el setDownloadURL: colocador a ClassA - es decir, el clase en sí . Desea establecer la propiedad de una instancia.

¿Cómo estás importando claseA en su clase AppDelegate? ¿Incluye el archivo .h en el proyecto principal? Tenía este problema por un tiempo porque no copiar el archivo de cabecera en el proyecto principal, así como el # include normal "ClassA.h."

La copia, o la creación de la .h resueltos por mí.

Para mí, lo que hizo que este error fue que tuve accidentalmente el mismo mensaje que se envía dos veces para el mismo miembro de la clase. Cuando hace clic derecho sobre el botón en la interfaz gráfica de usuario, pude ver el nombre del método en dos ocasiones, y me acaba de eliminar uno. error novato en mi caso con seguridad, pero quería que fuera allí para otros novatos a tener en cuenta.

La mía era algo simple / estúpida. error novato, para cualquier persona que se ha convertido su NSManagedObject a un NSObject normal.

Yo tenía:

@dynamic order_id;

cuando debería haber tenido:

@synthesize order_id;

Debe tener en cuenta que esto no es necesariamente el mejor patrón de diseño. Desde el aspecto de la misma, que son esencialmente está usando el delegado de la aplicación para almacenar lo que equivale a una variable global.

Matt Gallagher cubierto el tema de variables globales bien en su cacao con el artículo Love en http://cocoawithlove.com/2008/11/singletons-appdelegates-and-top-level.html . Con toda probabilidad, su claseA debe ser un producto único en lugar de un mundial en el AppDelegate, a pesar de su posible que claseA intención de ser más de uso general y no simplemente un conjunto unitario. En ese caso, probablemente sería mejor, ya sea con un método de clase para devolver una instancia preconfigurada de Clase A, algo como:

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

O, alternativamente, (ya que ello Agregar material específico de la aplicación a la que posiblemente sea una clase de propósito general), crear una nueva clase cuyo único propósito es contener ese método de clase.

El punto es que las variables globales de aplicaciones no necesitan ser parte de la AppDelegate. El hecho de que la AppDelegate es un producto único conocido, no significa que todos los demás aplicación mundial debe ser mezclado con él, incluso si no tienen nada que ver con conceptualmente el manejo de los métodos de delegado NSApplication.

Muy raro, pero. Usted tiene que declarar la clase para la instancia de aplicación como mi_aplicación: UIApplication en lugar de mi_aplicación: NSObject. Parece que el protocolo UIApplicationDelegate no implementa el mensaje + registerForSystemEvents. API loca de Apple, de nuevo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top