在一个块中保留循环
Retain loop in a block
我试图在块中获取 self
中的变量和属性以完成操作,但是,如果我在 self
中引用 self
或全局变量时 self
是对象 运行 块,它警告我保留循环。这是我正在做的事情:
- 我正在向类型为
(void(^)()
的 NSMutableArray
添加操作(换句话说,一个返回 void
且不带参数的块)。
我稍后使用此语法调用它,其中 i
是由代码确定的 int
(即在数组的边界内:
void (^someBlock)() = arrayOfActions[i];
someBlock();
代码运行良好,但是,因为我在块 中使用 self
的属性,Xcode 警告我存在保留循环。我应该忽略它,因为它只是一个警告并且在代码中一切正常(它只执行一次块),还是我应该做一些不同的事情?
您绝对不要忽略警告,而是使用__weak
来定义弱引用并消除保留循环,如in the documentation所述:
__weak SelfType *weakSelf = self;
void (^aBlock)() = ^(){
SelfType *strongSelf = weakSelf;
//User strongSelf
};
或者,您可以使用 libextobjc (https://github.com/jspahrsummers/libextobjc) 及其方便的 @strongify
和 @weakify
注释。
我试图在块中获取 self
中的变量和属性以完成操作,但是,如果我在 self
中引用 self
或全局变量时 self
是对象 运行 块,它警告我保留循环。这是我正在做的事情:
- 我正在向类型为
(void(^)()
的NSMutableArray
添加操作(换句话说,一个返回void
且不带参数的块)。 我稍后使用此语法调用它,其中
i
是由代码确定的int
(即在数组的边界内:void (^someBlock)() = arrayOfActions[i]; someBlock();
代码运行良好,但是,因为我在块 中使用 self
的属性,Xcode 警告我存在保留循环。我应该忽略它,因为它只是一个警告并且在代码中一切正常(它只执行一次块),还是我应该做一些不同的事情?
您绝对不要忽略警告,而是使用__weak
来定义弱引用并消除保留循环,如in the documentation所述:
__weak SelfType *weakSelf = self;
void (^aBlock)() = ^(){
SelfType *strongSelf = weakSelf;
//User strongSelf
};
或者,您可以使用 libextobjc (https://github.com/jspahrsummers/libextobjc) 及其方便的 @strongify
和 @weakify
注释。