Ich habe eine Klasse, die eine NSSet
enthält. Diese Aufgabe wird _collectibles
genannt, und in einem Verfahren, mache ich eine Kopie dieses Satzes um einige Verarbeitung, so etwas wie zu tun:Bizarre NSSet Kopieren Absturz
NSSet* collectibleCopy = [_collectibles copy];
In der Praxis sehe ich regelmäßig mit dieser Meldung abstürzen:
[__NSPlaceholderSet initWithObjects:count:]: attempt to insert nil object from objects
ich habe das Problem gelöst, indem Sie den obigen Code zu ändern zu:
NSMutableSet* collectibleCopy = [[NSMutableSet alloc] initWithCapacity: [_collectibles count]];
for (id thing in _collectibles) {
[collectibleCopy addObject: thing];
}
Und jetzt kann ich nicht reproduzieren mehr einen solchen Absturz. Ich wette, [copy]
ist effizienter, und ich würde es lieber verwenden, aber ich kann nicht herausfinden, warum es völlig wonky ist!
Update: während voller Kontext eine Tonne Erklärung nehmen würde, die Schlüssel zu mir dieser Lösung waren, dass ein, der Code auf diese Weise aufgerufen wurde:
NSBlockOperation* operation = [NSBlockOperation blockOperationWithBlock: ^{
[thing doStuff];
}];
[operationQueue addOperation: operation];
Und das war ich, im Grunde durch eine Herstellung Haufen Dinge langsamer, fangen die App mit 2 Fäden laufen 2 Fäden für eine Warteschlange thusly initialisiert:
operationQueue.maxConcurrentOperationCount = 1;
was ich dachte, unmöglich. Der Hinweis war, dass der zweite Thread in [NSAutoreleasePool drain] war, was mich dazu brachte, zu erfahren, dass NSOperationQueue immer dann Autorelease-Sachen machen kann, wenn es will.
Ich konnte Ihren Fehler nicht reproduzieren. Könntest du etwas mehr Code für den Kontext posten? – aLevelOfIndirection
ist der Satz, den Sie eine Kerndatenbeziehung kopieren? –
Der gesamte Kontext würde einen riesigen Stapel von Code erfordern. :) – GoldenBoy