Domanda

Nel AppDelegate, sto alloc'ing un'istanza definita in una libreria statica. Questa istanza ha una proprietà NSString impostare una "copia". Quando accedo la proprietà della stringa in questo caso, l'applicazione si blocca con 'il selettore non riconosciuto inviato ad esempio'. Xcode fornisce un suggerimento del codice per la proprietà, il che significa che è conosciuto in app chiamata. La classe particolare è compilato nel bersaglio libreria statica. Che cosa mi manca?

L'aggiunta di un po 'di codice.

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

//ClassA.m
@synthesize downloadUrl;

Nel AppDelegate dell'app chiamata.

//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/";
...}

Altre classi in applicazione otterrà un riferimento al delegato e chiamare classA.downloadUrl.

È stato utile?

Soluzione

1) Se la sintetizzare entro @implementation blocco?

2) si dovrebbe fare riferimento alla self.classA = [[ClassA alloc] init]; e self.classA.downloadUrl = @"..." invece di pianura classA?

3) Nella tua myApp.m il file è necessario importare ClassA.h, quando manca questo verrà impostato a un numero, o il puntatore? (In variabili C di default a int se non viene trovato dal compilatore):

#import "ClassA.h".

Altri suggerimenti

Set bandiera -ObjC in altra bandiera linker nel vostro ambiente di progetto ... (Non nel progetto di libreria statica, ma il progetto che sta usando la libreria statica ...) E assicurarsi che in Configurazione impostazione del progetto è impostato su Tutta la configurazione

Un sacco di persone hanno dato alcune risposte molto tecnici per questo e simili domande, ma penso che sia più semplice di quello. A volte, se non stai prestando attenzione un selettore che non si intende utilizzare può essere collegato a qualcosa nell'interfaccia. Si potrebbe essere sempre questo errore perché il selettore è lì, ma non è stato scritto alcun codice per esso.

Il modo più semplice per controllare due volte che questo non è il caso è di controllare clic sull'elemento modo da poter vedere tutti i selettori che sono associati con esso. Se c'è qualcosa lì dentro che non si vuole essere, sbarazzarsi di esso! Spero che questo aiuta ...

Nel codice che hai postato, si invia la setDownloadURL: setter a ClassA - vale a dire, il classe stessa . Si desidera impostare la proprietà di un'istanza.

Come stai importando ClasseA nella vostra classe AppDelegate? Hai incluso il file .h nel progetto principale? Ho avuto questo problema per un po 'perché non ho copiato il file di intestazione nel progetto principale così come il # include normale "ClassA.h."

La copia, o la creazione del .h risolto per me.

Per quanto mi riguarda, che cosa ha causato questo errore era che per sbaglio ho avuto lo stesso messaggio inviato due volte per lo stesso membro della classe. Quando destra cliccato sul pulsante nella gui, ho potuto vedere il nome del metodo per due volte, e ho appena cancellato uno. errore newbie nel mio caso per certo, ma voleva farlo fuori per altri neofiti da considerare.

La mia è stata una cosa semplice / stupido. errore Newbie, per tutti coloro che ha convertito la loro NSManagedObject ad un normale NSObject.

ho avuto:

@dynamic order_id;

quando ho dovuto avere:

@synthesize order_id;

Si dovrebbe notare che questo non è necessariamente il migliore modello di progettazione. Dagli sguardi di esso, si sono essenzialmente utilizza il delegato App per memorizzare ciò che equivale a una variabile globale.

Matt Gallagher coperto la questione della globali bene nel suo cacao dell'articolo Amore a http://cocoawithlove.com/2008/11/singletons-appdelegates-and-top-level.html . In tutto likelyhood, il vostro ClasseA dovrebbe essere un Singleton, piuttosto che una globale nel AppDelegate, anche se la sua possibile si ClasseA intento di essere più di uso generale e non semplicemente un Singleton. In quel caso, si sarebbe probabilmente meglio con sia un metodo di classe per restituire un'istanza preconfigurata di Classe A, qualcosa come:

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

O in alternativa (dal momento che sarebbe aggiungere roba specifica applicazione per quello che è forse una classe di uso generale), creare una nuova classe il cui unico scopo è quello di contenere quel metodo di una classe.

Il punto è che le variabili globali di applicazioni non hanno bisogno di essere parte del AppDelegate. Solo perché l'AppDelegate è un singoletto noto, non significa che ogni altra applicazione globale dovrebbe essere mescolato con esso, anche se non hanno nulla a che fare con concettualmente gestire i metodi delegato NSApplication.

Molto strano, ma. Si deve dichiarare la classe per l'istanza dell'applicazione come myApplication: UIApplication invece di myApplication: NSObject. Sembra che il protocollo UIApplicationDelegate non implementa il messaggio + registerForSystemEvents. API Pazzo di Apple, ancora una volta.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top