__weak 和块的强变量行为
__weak and strong variable behaviour with blocks
我是块的新手,在网上阅读时我发现我必须对块使用弱变量,因为块保留了变量。在将 self 与块一起使用时,我有点困惑。让我们举个例子:
@interface ViewController : UIViewController
@property (copy, nonatomic) void (^cyclicSelf1)();
-(IBAction)refferingSelf:(id)sender;
-(void)doSomethingLarge;
@end
这里我有一个 ViewController 并且它声明了具有复制属性的块 属性。我不想创建一个保留周期,所以我知道在块中使用 self 时我需要创建 self 的弱对象,例如:
__weak typeof(self) weakSelf = self;
我想确保我的块在后台线程上执行,并且可能在它完成之前被用户回击。我的街区正在执行一些有价值的任务,我不希望它松动。所以我需要自我直到块结束。我在我的实现文件中做了以下操作:
-(IBAction)refferingSelf:(id)sender
{
__weak typeof(self) weakSelf = self; // Weak reference of block
self.cyclicSelf1 = ^{
//Strong reference to weak self to keep it till the end of block
typeof(weakSelf) strongSelf = weakSelf;
if(strongSelf){
[strongSelf longRunningTask];//This takes about 8-10 seconds, Mean while I pop the view controller
}
[strongSelf executeSomeThingElse]; //strongSelf get nil here
};
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), self.cyclicSelf1);
}
根据我的说法,使用 typeof(weakSelf) strongSelf = weakSelf;
应该创建我的 self
的强引用,当用户回击时,self 仍将在块内有一个强引用,直到范围结束。
请帮我理解为什么会崩溃?为什么我的strongSelf没有拿着物体
你的参考性不强。只需像这样添加 __strong
指令:
__strong typeof(weakSelf) strongSelf = weakSelf;
我找到了答案。我自己真的很好奇,因为你的代码对我来说似乎是合法的。至少这个想法。所以我建立了一个类似的项目并进行了一些试验。问题是这一行:
typeof(weakSelf) strongSelf = weakSelf;
将其更改为
__strong typeof(weakSelf) strongSelf = weakSelf;
如@LDNZh 或
所建议
typeof(self) strongSelf = weakSelf;
并且您的代码将起作用。
更新: 由于这个问题经常出现,我对我的示例项目进行了一些更改。我将其发布在 github 上,供所有人日后参考。
我是块的新手,在网上阅读时我发现我必须对块使用弱变量,因为块保留了变量。在将 self 与块一起使用时,我有点困惑。让我们举个例子:
@interface ViewController : UIViewController
@property (copy, nonatomic) void (^cyclicSelf1)();
-(IBAction)refferingSelf:(id)sender;
-(void)doSomethingLarge;
@end
这里我有一个 ViewController 并且它声明了具有复制属性的块 属性。我不想创建一个保留周期,所以我知道在块中使用 self 时我需要创建 self 的弱对象,例如:
__weak typeof(self) weakSelf = self;
我想确保我的块在后台线程上执行,并且可能在它完成之前被用户回击。我的街区正在执行一些有价值的任务,我不希望它松动。所以我需要自我直到块结束。我在我的实现文件中做了以下操作:
-(IBAction)refferingSelf:(id)sender
{
__weak typeof(self) weakSelf = self; // Weak reference of block
self.cyclicSelf1 = ^{
//Strong reference to weak self to keep it till the end of block
typeof(weakSelf) strongSelf = weakSelf;
if(strongSelf){
[strongSelf longRunningTask];//This takes about 8-10 seconds, Mean while I pop the view controller
}
[strongSelf executeSomeThingElse]; //strongSelf get nil here
};
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), self.cyclicSelf1);
}
根据我的说法,使用 typeof(weakSelf) strongSelf = weakSelf;
应该创建我的 self
的强引用,当用户回击时,self 仍将在块内有一个强引用,直到范围结束。
请帮我理解为什么会崩溃?为什么我的strongSelf没有拿着物体
你的参考性不强。只需像这样添加 __strong
指令:
__strong typeof(weakSelf) strongSelf = weakSelf;
我找到了答案。我自己真的很好奇,因为你的代码对我来说似乎是合法的。至少这个想法。所以我建立了一个类似的项目并进行了一些试验。问题是这一行:
typeof(weakSelf) strongSelf = weakSelf;
将其更改为
__strong typeof(weakSelf) strongSelf = weakSelf;
如@LDNZh 或
所建议typeof(self) strongSelf = weakSelf;
并且您的代码将起作用。
更新: 由于这个问题经常出现,我对我的示例项目进行了一些更改。我将其发布在 github 上,供所有人日后参考。