在这个讨论之后,我遇到了一个错误的访问问题;
一个循环有几个步骤:a、b、c、... x、y、z:
-(void)cycle:(float)delta{
[self stepA]
[self stepB]
// etc.
[self stepZ]
}
在某些时候,步骤 x 执行以下操作:
// IRQ is an NSMutableArray
// Self is a reference to the engine running the cycles
[IRQ addObject:^{ NSLog(@"hello! %@", self); } ];
稍后,步骤 z 是处理所有“延迟”调用:
for (int i = 0; i < [IRQ count]; i++){
void (^delayedCall)(void) = [IRQ objectAtIndex:i];
delayedCall();
}
[IRQ removeAllObjects];
结果:EXEC_BAD_ACCESS
现在,如果步骤 x 只添加一个没有对象引用的纯字符串,如下所示,步骤 Z 可以正常工作:
[IRQ addObject:^{ NSLog(@"hello!"); } ];
最后观察,如果同一个步骤既将块添加到队列中,又遍历队列以执行块,则不会出现问题。就像对对象的引用随着步骤“丢失”:方法被留下?
我在这方面不太了解,需要更多帮助!
编辑:詹姆斯,只是尝试了以下方法来避免该参考周期:
NSString *userName = @"James";
[IRQ addObject:^{ NSLog(@"hello %@", userName); } ];
它也会发生。您的解决方案将如何应用于此?
提前致谢!