wake-up-neo.net

Wie kann "nicht erkannter Selektor an Instanz gesendet" aufgelöst werden?

In AppDelegate ordne ich eine in einer statischen Bibliothek definierte Instanz zu. Diese Instanz hat eine NSString-Eigenschaft, die eine "Kopie" festgelegt hat. Wenn ich in dieser Instanz auf die Zeichenfolge-Eigenschaft zugreife, stürzt die App mit 'Unbekannter Selektor an Instanz gesendet' ab. Xcode stellt einen Code-Hinweis für die Eigenschaft bereit, der in der aufrufenden App bekannt ist. Die jeweilige Klasse wird in das statische Bibliotheksziel kompiliert. Was vermisse ich?

Code hinzufügen.

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

//ClassA.m
@synthesize downloadUrl;

In der appDelegate der aufrufenden App.

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

Andere Klassen in der App erhalten einen Verweis auf den Delegaten und rufen die Klasse A.downloadUrl auf.

36
4thSpace

1) Befindet sich die Synthese im @implementation-Block?

2) Sollten Sie auf self.classA = [[ClassA alloc] init]; und self.classA.downloadUrl = @"..." statt auf einfache classA verweisen?

3) In Ihrer myApp.m-Datei müssen Sie ClassA.h importieren. Wird sie fehlen, wird standardmäßig eine Zahl oder ein Zeiger verwendet. (In C-Variablen standardmäßig auf int, wenn vom Compiler nicht gefunden):

#import "ClassA.h".

26
stefanB

Setzen Sie das Flag -ObjC in Other linker Flag in Ihrer Projekteinstellung ... (Nicht im statischen Bibliotheksprojekt, sondern in dem Projekt, in dem Sie die statische Bibliothek verwenden ...) Alle Konfiguration  

18
mihir mehta

Viele Leute haben sehr technische Antworten auf diese und ähnliche Fragen gegeben, aber ich denke, es ist einfacher als das. Wenn Sie nicht aufpassen, kann eine Auswahl, die Sie nicht verwenden möchten, an etwas in der Benutzeroberfläche angehängt werden. Möglicherweise wird diese Fehlermeldung angezeigt, weil der Selektor vorhanden ist, Sie jedoch keinen Code dafür geschrieben haben. 

Der einfachste Weg, um zu überprüfen, ob dies nicht der Fall ist, besteht darin, auf das Element zu klicken, um alle ihm zugeordneten Selektoren anzuzeigen. Wenn es irgendetwas gibt, das du nicht sein möchtest, dann entferne es! Hoffe das hilft...

14
Dave Kanter

Meines war etwas einfaches/dummes. Anfängerfehler für jeden, der sein NSManagedObject in ein normales NSObject konvertiert hat.

Ich hatte:

@dynamic order_id;

wenn ich hätte haben sollen:

@synthesize order_id;
1
Dan Power

Wie importieren Sie ClassA in Ihre AppDelegate-Klasse? Haben Sie die .h-Datei in das Hauptprojekt eingefügt? Ich hatte dieses Problem für eine Weile, weil ich die Header-Datei nicht in das Hauptprojekt sowie das normale #include "ClassA.h" kopiert habe. 

Das Kopieren oder Erstellen der .h löste es für mich.

1
Heat Miser

Der Grund für diesen Fehler war für mich, dass ich versehentlich dieselbe Nachricht zweimal an denselben Teilnehmer gesendet habe. Als ich den Button in der GUI mit der rechten Maustaste anklickte, konnte ich den Methodennamen zweimal sehen und ich habe nur einen gelöscht. Newbie-Fehler in meinem Fall sicher, aber wollte es für andere Neulinge in Betracht ziehen. 

1
Rich

In dem von Ihnen geposteten Code senden Sie den setDownloadURL:-Setter an ClassA - dh an die Klasse selbst . Sie möchten die Eigenschaft einer Instanz festlegen.

1
Chuck

Sie sollten beachten, dass dies nicht unbedingt das beste Designmuster ist. Wie es aussieht, verwenden Sie im Wesentlichen Ihren App-Delegierten, um die Beträge einer globalen Variablen zu speichern.

Matt Gallagher hat das Thema Globals in seinem Artikel Cocoa with Love unter http://cocoawithlove.com/2008/11/singletons-appdelegates-and-top-level.html ausführlich behandelt. In aller Wahrscheinlichkeit sollte Ihr ClassA ein Singleton und nicht ein globales Element in AppDelegate sein, obwohl es möglich ist, dass ClassA mehr Zweck hat und nicht einfach ein Singleton ist. In diesem Fall wäre es wahrscheinlich besser, wenn Sie entweder eine Klassenmethode verwenden, um eine vorkonfigurierte Instanz der Klasse A zurückzugeben, etwa:

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

Oder erstellen Sie alternativ (da dies anwendungsspezifisches Material zu einer möglicherweise universellen Klasse hinzufügen würde) eine neue Klasse, deren einziger Zweck darin besteht, diese Klassenmethode zu enthalten.

Der Punkt ist, dass Anwendungs-Globals nicht Teil von AppDelegate sein müssen. Nur weil AppDelegate ein bekanntes Singleton ist, bedeutet dies nicht, dass jede andere globale App mit ihr gemischt werden sollte, auch wenn sie konzeptionell nichts mit der Handhabung der NSApplication-Delegatmethoden zu tun hat.

0
Peter N Lewis

Sehr komisch, aber. Sie müssen die Klasse für Ihre Anwendungsinstanz als myApplication: UIApplication anstelle von myApplication: NSObject deklarieren. Es scheint, dass das UIApplicationDelegate-Protokoll die + registerForSystemEvents-Nachricht nicht implementiert. Wieder verrückte Apple-APIs.

0
H2CO3