2016-05-04 5 views
0

zuweisen Ich habe ein SIGABRT bekam, wenn ich Wert auf die Eigenschaft „MYLOCAL“ der Klasse zuweisen CMRequestManager in einem Singleton Init. Was ist los mit dir?SIGABR Ausnahme, wenn versuchen, eine Eigenschaft in einem Singleton

@interface CMRequestManager (private) 
     @property (nonatomic,strong) NSString* myLocal; 
@end 

@implementation CMRequestManager 
     #pragma mark Singleton Methods 
     + (id)Manager { 
      static CMRequestManager *sharedMyManager = nil; 
      static dispatch_once_t onceToken; 
      dispatch_once(&onceToken, ^{ 
       sharedMyManager = [[self alloc] init]; 
       sharedMyManager.myLocal = @"test test"; //SIGABRT !!!! 
      }); 
      return sharedMyManager; 
     } 

     - (id)init { 
      if (self = [super init]) { 

      } 
      return self; 
     } 
@end 

EDIT:

Ok, ich habe eine Lösung gefunden: bewegen Eigenschaft "MYLOCAL" in der Header-Datei außerhalb der Klassenerweiterung:

@interface CMRequestManager 
@property (nonatomic,strong) NSString* myLocal; 
@end 

Diese Arbeit, aber ich verstehe nicht warum. Also die Frage bleibt: Was ist falsch in meinem vorherigen Code?

+0

siehe ths einmal http://stackoverflow.com/questions/14271421/exception-type-exc-crash-sigabt –

+0

Anstelle dieser Zeile ** sharedMyManager = [[Self Alloc] Init]; **, können Sie ersetzen mit ** sharedMyManager = [[CMRequestManager alloc] init]; **. nur eine Vermutung, bitte versuchen Sie es. – user3300864

+0

Ich habe es versucht und mache den gleichen Fehler –

Antwort

1
@interface CMRequestManager (private) 

Dies ist Ihr Problem. Was Sie meinte, war:

@interface CMRequestManager() 

Diese scheinen sehr ähnlich, aber sie sind eigentlich ganz anders. Der erste ist eine Kategorie. Du versprichst nur, dass eine solche Eigenschaft existiert, aber es wird kein Backing-Ivar zugewiesen und es werden keine Getter und Setter synthetisiert. Sie würden einen @implementation Block irgendwo benötigen, der diese tatsächlich zur Verfügung stellte.

Wenn Sie sich Ihre Logs angesehen haben, würden Sie wahrscheinlich etwas wie "CMRequestManager nicht key-value-konform für myLocal" oder "CMRequestManager reagiert nicht auf selector -myLocal" oder so ähnlich sehen. Überprüfen Sie immer die Protokollausgabe. Die Antwort ist sehr oft da drin. Die zweite Form mit () ist eine Erweiterung. Eine Erweiterung ist eine Fortsetzung der Klassendefinition. Dort definierte Eigenschaften erhalten automatisch Speicher und synthetisierte Getter und Setter.

Der Unterschied zwischen diesen beiden ist sehr historisch. Die Kategorieform existiert seit den frühen Tagen von ObjC, lange bevor Eigenschaften zur Sprache hinzugefügt wurden (es war ursprünglich eine Möglichkeit, die Schnittstellen für große, komplizierte Objekte aufzuspalten, und wurde später in erster Linie zu einer Art "geschützter" oder "geschützter" Freund "Methoden). Das Erweiterungsformular ist eine neuere Ergänzung und sieht so aus, als ob es die Kategorien wäre, an die wir gewöhnt waren, und bietet einige zusätzliche Features, die mit ObjC 2 geliefert wurden (wie Eigenschaften und synthetisierte Methoden).

Dies funktioniert, wenn Sie die Eigenschaft verschoben haben, weil Sie es Teil der tatsächlichen Schnittstelle gemacht haben, die dasselbe ist, das das Einfügen in eine Erweiterung tun würde. Weitere Informationen zu Kategorien und Erweiterungen finden Sie unter Programming with Objective-C.

Verwandte Themen