1

我在块中有许多方法,在下一个中触发一个,以便将一些数据与 Web 服务同步。self其中大多数行为完全正常,但有一种方法在被调用后不会让我提及,给我一个capturing self strongly in this block is likely to lead to a retain cycle警告。

这就是我的意思:

[self deleteEntriesCorrespondingToDeletedNotesInNotebook:notebook success:^{
    [self deleteNotesToMatchDeletedEntriesWithCompletion:^{
       [self deleteResourcesToMatchDeletedMediaItemsWithCompletion:^{
           [self addOrUpdateEntriesCorrespondingToUpdatedNotesInNotebook:notebook success:^{
               //Anything calling a property or self after this point is a problem and gives the warning
               [self addOrUpdateNotesCorrespondingToUpdatedEntriesWithCompletion:^{

               }];
           }failure:^{

           }];
       }];
   }];
}failure:^{

}];

任何想法为什么只有通过这一点的项目对此有问题?如果我将之前的方法替换为另一种类似的方法,则没有问题。问题只有在使用后才存在addOrUpdateEntriesCorrespondingToUpdatedNotesInNotebook:

4

2 回答 2

3
[self deleteEntriesCorrespondingToDeletedNotesInNotebook:notebook success:^{
    [self deleteNotesToMatchDeletedEntriesWithCompletion:^{  //this line here and the rest in your downward loop

不要使用自我。而是在第一行之前执行此操作

__typeof__(self) __weak _weakSelf = self; 然后从第二行开始,替换selfweakSelf

尝试这个。干杯

于 2013-07-10T09:52:59.530 回答
2

您的所有方法都可以“表现良好”或创建保留周期,具体取决于它们对完成块所做的操作。

如此处所述:块保留命名约定的循环?,clang 编译器使用命名约定来决定是否发出警告:所有方法add...set...(但不是addOperationWithBlock!)都会导致警告,其他方法不会。

于 2013-07-10T10:00:31.077 回答