我想弄清楚我这样做是否正确:
如果我有一个 block ,我会这样做:
__weak MyClass *weakSelf = self;
[self performBlock:^{ //<< Should I use self, or weakSelf here?
[weakSelf doSomething];
} afterDelay:delay];
但是如果一个 block 中有一个 block 会发生什么?这是正确的吗?
__weak MyClass *weakSelf = self;
[self performBlock:^{
[weakSelf doSomething];
[self performBlock:^{
[weakSelf doSomething];
} afterDelay:1.0f];
} afterDelay:delay];
另外,在下面的函数中,是否需要使用[block copy]?
- (void)performBlock:(void (^)(void))block afterDelay:(float)delay
{
if (block)
{
if (delay > 0)
{
[self performSelector:@selector(executeBlockAfterDelay:) withObject:[block copy] afterDelay:delay];
}
else
{
[self executeBlockAfterDelay:[block copy]];
}
}
}
- (void)executeBlockAfterDelay:(void(^)(void))block
{
if (block)
block();
}
最佳答案
在这种情况下(如下)只使用 strong self
,因为 block 只是在那几秒钟被复制。通常,如果您希望 self
执行 block ,您希望它一直存活到那个时候,所以强引用是完全可以的。
[self performBlock:^{
[self doSomething]; // strong is OK
} afterDelay:delay];
嵌套block?在你的情况下,这两个 block 只是延迟的单发 block ,所以和上面一样,使用强。但是block之间是有区别的。如果您将 block 存储较长时间,也许对于多次调用您应该避免保留周期。
示例:
self.callback = ^{
[self doSomething]; // should use weakSelf
};
这可能导致循环保留。事实上,这取决于 block 的使用方式。我们看到该 block 存储(复制)在属性中供以后使用。但是,您可以通过取消不再使用的 block 来防止保留循环。在这种情况下:
self.callback(); //invoke
self.callback = nil; //release
使用 ARC 时,您不必自己复制 block 。早期版本添加 block 后有错误,但现在 ARC 下的编译器知道何时复制 block 。在这种情况下复制它就足够聪明了:
[self performSelector:@selector(executeBlockAfterDelay:) withObject:block afterDelay:delay];
关于ios - block block block ,用 __weak self,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15448518/