Frage

In der AppDelegate, ich bin alloc'ing eine Instanz in einer statischen Bibliothek definiert. Diese Instanz hat eine NSString Eigenschaft eine „Kopie“. Wenn ich die String-Eigenschaft auf dieser Instanz zugreifen, stürzt die App mit ‚Unbekannter Selektor an Instanz gesendet‘. Xcode stellt einen Codehinweis für die Eigenschaft, das heißt, es in der anrufenden App bekannt ist. Die besondere Klasse in das statische Bibliothek Ziel zusammengestellt. Was bin ich?

einige Code hinzufügen.

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

//ClassA.m
@synthesize downloadUrl;

In der Berufung App 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/";
...}

Andere Klassen in der App werden einen Verweis auf die Delegierten erhalten und classA.downloadUrl nennen.

War es hilfreich?

Lösung

1) Ist der synthesize innerhalb @implementation Block?

2) Sollten Sie verweisen anstelle von einfachen self.classA = [[ClassA alloc] init]; self.classA.downloadUrl = @"..." und classA?

3) In Ihrer myApp.m Datei benötigen Sie ClassA.h zu importieren, wenn es fehlt es an einer Reihe ausfällt, oder Zeiger? (In C-Variablen standardmäßig in int wenn nicht vom Compiler gefunden):

#import "ClassA.h".

Andere Tipps

Set-Flag -ObjC in Anderen Linker Flagge in Ihrer Projekteinstellung ... (nicht in dem statischen Bibliothek-Projekt, aber das Projekt, dass sie mit statischer Bibliothek ...) Und stellen Sie sicher, dass in Projekteinstellung Konfiguration ist auf Alle Konfiguration

Eine Menge Leute haben einige sehr technische Antworten auf diese und ähnliche Fragen gegeben, aber ich denke, es ist einfacher als das. Manchmal, wenn Sie nicht aufpasst einen Wähler, die Sie nicht beabsichtigen, können verwendet werden, um etwas in der Schnittstelle angeschlossen werden. Man könnte diesen Fehler bekommen, weil die Wähler gibt es aber Sie haben keinen Code für ihn geschrieben wird.

Der einfachste Weg, um doppelt zu überprüfen, dass dies nicht der Fall, wird das Element bei gedrückter Ctrl-so dass Sie alle die Wähler sehen, die mit ihm verbunden sind. Wenn es etwas gibt, in die Sie nicht wollen, zu sein, es loszuwerden! Hoffe, das hilft ...

Im Code, den Sie geschrieben, du bist der setDownloadURL: Setter ClassA Senden - das heißt, die Klasse selbst . Sie möchten die Eigenschaft einer Instanz setzen.

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

Kopieren oder Erstellen der .h gelöst es für mich.

Für mich, was diesen Fehler verursacht war, dass ich hatte versehentlich die gleiche Nachricht zweimal an der gleichen Klasse Mitglied gesendet werden. Wenn ich nach rechts auf die Schaltfläche in der gui geklickt haben, konnte ich den Namen der Methode zweimal sehen, und ich eine gerade gelöscht. Newbie Fehler in meinem Fall sicher, aber ich wollte es auch für andere Neulinge dort raus zu betrachten.

Meins war etwas einfach / dumm. Newbie Fehler, für alle, die ihre NSManagedObject zu einem normalen NSObject umgewandelt hat.

Ich habe:

@dynamic order_id;

, wenn ich gehabt haben sollte:

@synthesize order_id;

Sie sollten beachten, dass dies nicht unbedingt das beste Design-Muster. Von den Blicken von ihm, verwenden Sie im Wesentlichen AppDelegate zu speichern, was zu einer globalen Variablen beträgt.

Matt Gallagher bedeckt die Ausgabe von Globals gut in seinem Kakao mit Lieben Artikeln unter http://cocoawithlove.com/2008/11/singletons-appdelegates-and-top-level.html . Aller Wahrscheinlichkeit sollte Ihr KlasseA ein Singleton sein, anstatt eine globale im AppDelegate, obwohl seine mögliche Sie Absicht KlasseA allgemeineren Zweck zu sein und nicht nur ein Singleton. In diesem Fall würden Sie wahrscheinlich besser dran, entweder mit einer Klassenmethode eine vorkonfigurierte Instanz der Klasse A zurückzukehren, so etwas wie:

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

oder alternativ (da diese Anwendung spezifische Dinge zu dem, was möglicherweise ein Allzweck-Klasse hinzufügen würde), erstellen Sie eine neue Klasse, deren einziger Zweck darin besteht, dass die Klassenmethode zu enthalten.

Der Punkt ist, dass die Anwendung Globals braucht nicht Teil des AppDelegate zu sein. Nur weil die AppDelegate eine bekannte Singleton ist, nicht jede andere App bedeutet global mit ihm vermischt werden sollte, auch wenn sie nichts vom Konzept her mit der Handhabung des NSApplication Delegatmethoden zu tun.

Sehr seltsam, aber. Sie haben die Klasse für Ihre Anwendungsinstanz als myApplication zu deklarieren: UIApplication statt myApplication: NSObject. Es scheint, dass das UIApplicationDelegate Protokoll nicht die + registerForSystemEvents Nachricht nicht implementiert. Verrücktes Apple-APIs, wieder.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top