我遇到了 ARC 和块的问题,但已经解决了这个问题。不幸的是,我不知道到底发生了什么,并且想更多地了解我的情况。
最初,我有这样做的代码
for(__block id<Foo> object in objects) {
foo download:someParm
success:^{
object.state = StateNewState;
}
];
}
这导致了保留的不平衡。当一个对象被访问并且据说已经被释放时,就会发生崩溃。我编写了一个实现并使用“复制”属性创建一个成功块属性的类,该属性保存了传递给下载函数成功参数的块。我用以下代码替换了代码
for(id<Foo> object in objects) {
foo download:someParm
success:^(id<Foo> successObject){
successObject.state = StateNewState;
}
];
}
没有更多的释放对象错误,但我还没有运行工具来检查我是否没有泄漏。一些如何使用 __block 导致对象被释放太多次,我不知道为什么。我将继续研究这个问题的原因,但我认为这对你们其他人来说是一个有趣的问题。
我想可能值得注意的是 objects 数组是一个自动释放的数组,它是在我在本文前面写下的代码的行中创建的。不要认为这很重要,但我想我只是在那里度过。我在这篇文章中的代码不是确切的代码,因为我正在使用它来工作并且那里有一堆绒毛。但是在 for 循环中没有创建其他对象。
当应用程序崩溃时,它会运行下载,然后运行回调,顺便说一下,我正在使用 ASIHttp。当我尝试再次下载时,它会运行并且不会调用回调,因为对象已被释放并且委托被取消。在此之后,当包含指向对象的指针的字典访问对象时,我们会崩溃。