Question

Dans le AppDelegate, j'alloc'ing une instance définie dans une bibliothèque statique. Cette instance a une propriété NSString définir une « copie ». Quand j'accéder à la propriété de chaîne sur cette instance, l'application se bloque avec «sélecteur non reconnu envoyé à l'instance. Xcode fournit une indication de code de la propriété, ce qui signifie qu'il est connu dans l'application d'appel. La classe particulière est compilé dans la cible de la bibliothèque statique. Qu'est-ce que je manque?

Ajout d'un code.

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

//ClassA.m
@synthesize downloadUrl;

Dans appDelegate de l'application appelant.

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

D'autres classes dans l'application va obtenir une référence au délégué et appeler classA.downloadUrl.

Était-ce utile?

La solution

1) Est-ce synthétisent dans les blocs @implementation?

2) Si vous consultez et self.classA = [[ClassA alloc] init]; au lieu de plaine self.classA.downloadUrl = @"..." classA?

3) Dans votre fichier, vous devez myApp.m importer ClassA.h, quand il manque il sera par défaut à un certain nombre ou pointeur? (À défaut des variables C int si elle est introuvable par le compilateur):

#import "ClassA.h".

Autres conseils

Set drapeau -ObjC Autres drapeau dans votre cadre du projet de liaison ... (pas dans le projet de bibliothèque statique mais le projet vous qui utilise la bibliothèque statique ...) Et assurez-vous que réglage du projet de configuration est réglé sur Tous configuration

Beaucoup de gens ont donné des réponses très techniques pour cette année et des questions similaires, mais je pense qu'il est plus simple que cela. Parfois, si vous ne payez pas l'attention d'un sélecteur que vous ne comptez pas utiliser peut être attaché à quelque chose dans l'interface. Vous pourriez obtenir cette erreur, car le sélecteur est là, mais vous ne l'avez pas écrit de code pour elle.

La façon la plus simple à double vérifier que ce n'est pas le cas est de contrôler-cliquez sur l'élément de sorte que vous pouvez voir tous les sélecteurs qui y sont associés. S'il y a quelque chose là-bas que vous ne voulez pas être, se débarrasser de celui-ci! Espérons que cela aide ...

Dans le code affiché, vous envoyez le setter à setDownloadURL: ClassA - qui est, classe elle-même . Vous souhaitez définir la propriété d'une instance.

Comment ClassA vous importez dans votre AppDelegate classe? Avez-vous inclus le fichier .h dans le projet principal? J'ai eu ce problème pendant un certain temps parce que je ne l'ai pas copier le fichier d'en-tête dans le projet principal, ainsi que la #include normale « ClassA.h. »

Copie, ou la création de l'.h résolu pour moi.

Pour moi, ce qui a causé cette erreur était que j'avais accidentellement le même message envoyé deux fois au même membre de la classe. Quand je faites un clic droit sur le bouton dans l'IUG, je pouvais voir le nom de la méthode deux fois, et je viens de supprimer un. erreur Débutant dans mon cas sûr, mais je voulais le faire là-bas pour d'autres débutants à considérer.

Le mien était quelque chose de simple / stupide. erreur Débutant, pour toute personne qui a transformé leur NSManagedObject à un NSObject normal.

J'avais:

@dynamic order_id;

quand j'aurais dû:

@synthesize order_id;

Il est à noter que ce n'est pas nécessairement le meilleur modèle de conception. Des regards de celui-ci, vous êtes essentiellement utilisez votre délégué App pour stocker ce qui équivaut à une variable globale.

Matt Gallagher a couvert la question de bien dans son GLOBALS Cocoa avec l'article L'amour http://cocoawithlove.com/2008/11/singletons-appdelegates-and-top-level.html . Dans tous les likelyhood, votre ClassA devrait être une intention singleton plutôt que d'un mondial dans le AppDelegate, bien que possible, vous ClassA d'être l'objet plus général et non pas simplement un singleton. Dans ce cas, vous seriez probablement mieux avec soit une méthode de classe pour retourner une instance pré-configurée de classe A, quelque chose comme:

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

Ou bien (car cela ajouter une application spécifique à des choses ce qui est peut-être une classe d'usage général), créer une nouvelle classe dont le seul but est de contenir cette méthode de classe.

Le point est que l'application ne GLOBALS pas besoin d'être une partie de la AppDelegate. Tout simplement parce que le AppDelegate est un singleton connu, ne signifie pas que devrait être global mixed tous les app avec elle, même si elles ont rien à voir avec le plan conceptuel la manipulation des méthodes déléguées NSApplication.

Très bizarre, mais. Vous devez déclarer la classe pour votre instance d'application comme monApplication: UIApplication au lieu de monApplication: NSObject. Il semble que le protocole UIApplicationDelegate ne met pas en oeuvre le message + registerForSystemEvents. Fou API d'Apple, encore une fois.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top