2010-07-10 6 views
66
gesendet

Ich habe versucht, meine NSMutableArray 100 Wege von Sonntag zu initialisieren, und NOTHING funktioniert für mich. Ich habe versucht, es gleich einem neu zugewiesenen und initialisierten NSMutableArray zu setzen, nur zuzuteilen, die Variable selbst zu initialisieren, jede Kombination, die mir einfiel, und immer das gleiche Ergebnis.NSMutableArray addObject: - [__ NSArrayI addObject:]: nicht erkannter Selektor an Instanz

Hier ist der Code:

Object.h

NSMutableArray *array; 

@property (copy) NSMutableArray *array; 

Object.m

@synthesize array; 

if (self.array) { 
    [self.array addObject:anObject]; 
} 
else { 
    self.array = [NSMutableArray arrayWithObjects:anObject, nil]; 
} 

HINWEIS: debug "anObject" zur Zeit nicht nil der Ausführung ist ...

Ich habe einObject getestet und es ist Die Initialisierung funktioniert gut, aber ich bekomme den Fehler unter, wenn Ich versuche, object: zu self.array.

2010-07-10 11: 52: 55,499 MeineAnw [4347: 1807] - [__ NSArrayI addObject]: unerkannte Selektor Instanz gesendet 0x184480

2010-07-10 11: 52: 55,508 MeineAnw [4347: 1807] *** Beenden app aufgrund nicht abgefangene Ausnahme 'NSInvalidArgumentException', Grund: '- [__ NSArrayI addObject:]: Unbekannter Selektor an Instanz gesendet 0x184480'

hat jemand eine Ahnung, was falsch los ist ?

Antwort

11

Ich möchte Georg Fritzsche meinen Hut geben.Ich musste am Ende benutzen (kopieren) anstatt (behalten), und ich hätte nicht gewusst, was ich ohne seine Eingabe machen könnte.

//@property (copy) NSMutableArray *array; 
@property (nonatomic, copy) NSMutableArray *array; //overridden method is non-atomic as it is coded and should be reflected here. 

Wenn Sie (Kopie) auf einem veränderliches Objekt verwenden Sie die „Setter“ Methode überschreiben, müssen Sie wie folgt vor ...

- (void)setArray:(NSArray *)newArray { 

    if (array != newArray) { 
     [array release]; 
     array = [newArray mutableCopy]; 
//  [array retain]; // unnecessary as noted by Georg Fritzsche 
    } 

    return; 
} 

Hinweis: Sie werden eine Compiler-Warnung erhalten: Inkompatible Ziel -C Typen Initialisierung 'struct NSArray *', erwartete 'struct NSMutableArray *' Ich habe entschieden, den newArray-Parameter als (NSArray *) zu deklarieren, weil Sie die Flexibilität haben, jedes Array übergeben und korrekt in Ihre (NSMutableArray *) kopiert Variable. Wenn Sie den newArray-Parameter als (NSMutableArray *) deklarieren möchten, müssen Sie die mutableCopy-Methode beibehalten, um die gewünschten Ergebnisse zu erhalten.

Prost auf Georg! Z @ K!

+0

Beachten Sie, dass Ihre Eigenschaftsdeklaration nicht mit dem Ivar-Typ übereinstimmen muss, also sollten Sie' @property (nonatomic, copy) NSArray verwenden * Array; 'in Ihrem Fall. Beachten Sie auch, dass Ihre Eigenschaft implizit atomar ist, die Implementierung Ihres Setter jedoch nicht - siehe [Atomicity] (http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/ObjectiveC/Articles/ocProperties.html) # // Apple_ref/doc/uid/TP30001163-CH17-SW28). –

+1

Schließlich gibt '-mutableCopy' bereits eine zurückgehaltene Instanz zurück, so dass es nicht nötig ist, [array retain] - siehe [Object Ownership Policy] (http://developer.apple.com/mac/library/documentation/Cocoa) /Conceptual/MemoryMgmt/Articles/mmObjectOwnership.html#//apple_ref/doc/uid/20000043-SW1). –

+0

Nochmals vielen Dank, Herr Fritzsche. Ich war neugierig auf dieses Extra, aber es schien in meinem Programm zu funktionieren. Anscheinend habe ich einen Fehler woanders. : -/Sie sind der Mann, ich danke Ihnen für Ihren Beitrag zu diesem Beitrag und, unbeabsichtigt, mein Programm; Ich schätze deine Zeit! Mit freundlichen Grüßen, Z @ K! – Zak

81

Der synthetisierte Setter für @property (copy) sendet eine copy Nachricht an das Array, die eine unveränderliche Kopie ergibt.

Sie haben keine andere Wahl als den Setzer selbst zu setzen, wie detailed in der Objective-C Anleitung.

+0

ABSOLUT RICHTIG!Ich habe es erkannt, als ich meinen Beitrag geschrieben habe, und ich habe meinen Entschluss unten gepostet. Ich habe nicht wirklich darüber nachgedacht, den Setter zu überlisten, aber in meinem Fall brauche ich keine Kopie, also hat meine Lösung für mich funktioniert. Danke für die schnelle Antwort! - Z @ K! – Zak

+1

Der Link zum Objective-C-Handbuch ist unterbrochen. – johnnieb

69

Als ich meinen Beitrag las, kam mir ein Gedanke und ich beantwortete meine eigene Frage. Diese Lösung war so unklar, dass ich beschloss, den Beitrag zu schreiben und selbst zu beantworten (damit andere Neulinge, wie ich, nicht aufgelegt werden).

Mein Fehler in war ...

@property (copy) NSMutableArray *array; 

sollte es gewesen sein ...

@property (retain) NSMutableArray *array; 

Der Fehler wurde nicht in der Art und Weise geschieht ich meinen Code ausführen, sondern in der wie das anObject versuchte, das NSMutableArray-Array zu "kopieren".

Wie wir alle wissen ...

mutableArray = [mutableArray copy]; 

ist nicht immer (oder je nach meiner Erfahrung) gleich ...

mutableArray = [mutableArray mutableCopy]; 

Und das war die Quelle meines Problems. Durch einfaches Umschalten der @ Eigenschaft von (Kopie) auf (behalten) löste ich mein Problem.

+0

Ich hatte das gleiche Problem, löste ich meine wechselnde Eigenschaft von Kopie zu behalten ... @ Zak +1 für Ihre Antwort. – Rupesh

+0

Sie sollten dies als die akzeptierte Antwort markieren. – NathanAldenSr

+1

'mutableCopy' hat gerade mein Leben gerettet – michaelsnowden

-4

Diese Ausnahme kann auftreten, wenn eines der Objekte im Array null ist.

+1

Nicht dieser besondere Fehler, nein. Sie erhalten eine andere Ausnahme, wenn Sie versuchen, ein Nil-Objekt einzufügen. –

+0

Darüber hinaus können Arrays NSNull einfach gut enthalten. – stephencelis

3

Ich bekam den gleichen Fehler, obwohl meine Eigenschaften stark waren (mit ARC) und ich das Array mit NSMutableArray zugewiesen.

Was geschah, war, dass ich das veränderbare Array (wie es benutzerdefinierte Objekte enthält) für die zukünftige Verwendung archiviert und beim Decodieren es eine unveränderbare Kopie zurückgibt.

Ich hoffe, es hilft jedem da draußen.

3

Haben Sie einige Indizes (in ein Datenarray an anderer Stelle) und wollte sie in numerischer Reihenfolge (aus einem guten Grund) haben. Crashing bis am Ende hinzugefügt mutableCopy. Völlig verwirrt, bis ich mich daran erinnerte, dass Objective-C literal @ [] ein nicht veränderbares Array zurückgibt.

NSMutableArray *a = [@[@(self.indexA), @(self.indexB)] mutableCopy]; 
NSLog(@"%@", a); 
[indexArray sortUsingComparator: ^(NSNumber *obj1, NSNumber *obj2) { 
    return [obj1 compare:obj2]; 
}]; 
NSLog(@"%@", a); 

Danke, Zak!

0

Ich wurde von dieser Ausnahme gebissen für einen Tippfehler, den ich gemacht habe, vielleicht wird es jemanden 5 min. ihrer Zeit:

Ich schrieb:

NSMutableArray *names = [NSArray array]; 

statt: auch ein NSArray

NSMutableArray *names = [NSMutableArray array]; 

Der Compiler kein Problem damit hat, weil NSMutableArray, aber es stürzt ab, wenn versucht, ein hinzufügen Objekt.

0

Der Fehler ist als Ergebnis des Versuchs aufgetreten, ein Objekt zu einem NSMutableArray-Typ hinzuzufügen, der tatsächlich auf ein NSArray-Objekt verweist. Diese Art von Szenario in einigen Demo-Code ist unten dargestellt:

NSString *test = @"test"; 
NSMutableArray *mutableArray = [[NSMutableArray alloc] init]; 
[mutableArray addObject:test]; 
NSArray *immutableArray = [[NSArray alloc] init]; 
mutableArray = immutableArray; 
[mutableArray addObject:test]; // Exception: unrecognized selector 

Aus dem obigen Code ist es leicht zu sehen, dass eine Unterklasse Typ einer Supertyp zugeordnet wird. In Java wäre dies beispielsweise sofort als Fehler gekennzeichnet worden (Konvertierungsfehler zwischen den Typen), und das Problem wurde relativ schnell behoben. Um Objective-C gegenüber gerecht zu werden, wird eine Warnung ausgegeben, wenn versucht wird, eine inkompatible Aufgabe auszuführen, dies scheint jedoch einfach nicht genug zu sein und das Ergebnis kann für Entwickler ein echter Schmerz sein. Glücklicherweise war es diesmal nicht ich selbst, der den größten Teil dieses Schmerzes trug: P

Verwandte Themen