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