我有一个包含一个类的类NSSet.调用该对象_collectibles,并在方法中,我制作该集的副本以进行某些处理,例如:
NSSet* collectibleCopy = [_collectibles copy];
Run Code Online (Sandbox Code Playgroud)
在实践中,我看到这个消息经常崩溃:
[__NSPlaceholderSet initWithObjects:count:]: attempt to insert nil object from objects
Run Code Online (Sandbox Code Playgroud)
我已通过将上述代码更改为:
NSMutableSet* collectibleCopy = [[NSMutableSet alloc] initWithCapacity: [_collectibles count]];
for ( id thing in _collectibles ) {
[collectibleCopy addObject: thing];
}
Run Code Online (Sandbox Code Playgroud)
现在我再也无法重现任何此类崩溃.我打赌[copy]更有效率,我宁愿使用它,但我无法弄清楚为什么它完全不稳定!
更新:虽然完整的上下文需要大量的解释,但解决这个问题的关键是,a,代码是这样调用的:
NSBlockOperation* operation = [NSBlockOperation blockOperationWithBlock: ^{
[thing doStuff];
}];
[operationQueue addOperation: operation];
Run Code Online (Sandbox Code Playgroud)
我是,基本上通过使一堆事情变得更慢,捕获应用程序与2个线程运行2个线程为这样的队列初始化:
operationQueue.maxConcurrentOperationCount = 1;
Run Code Online (Sandbox Code Playgroud)
我认为这是不可能的.线索是第二个线程在[NSAutoreleasePool drain]中,这让我知道NSOperationQueue可以随时随地做自动释放的东西.
objective-c ×1