【发布时间】:2011-05-20 03:34:29
【问题描述】:
恐怕这个问题很基础,但我认为它与许多陷入困境的 Objective-C 程序员有关。
我听说,由于块捕获其中引用的局部变量作为const 副本,因此在块中使用self 可能会导致保留周期,如果该块被复制。因此,我们应该使用__block 来强制块直接处理self 而不是复制它。
__block typeof(self) bself = self;
[someObject messageWithBlock:^{ [bself doSomething]; }];
而不仅仅是
[someObject messageWithBlock:^{ [self doSomething]; }];
我想知道的是:如果这是真的,有没有办法可以避免丑陋(除了使用GC)?
【问题讨论】:
-
我喜欢打电话给我的
self代理this只是为了翻转。在 JavaScript 中,我将我的this闭包称为self,因此感觉很好且平衡。 :) -
我想知道如果我使用 Swift 块是否需要执行任何等效操作
-
@BenLu 绝对!在 Swift 闭包(以及隐含或显式提及 self 的函数)将保留 self.有时这是需要的,有时它会创建一个循环(因为闭包本身被自己拥有(或被自己拥有的东西拥有)。发生这种情况的主要原因是因为 ARC。
-
为避免出现问题,定义要在块中使用的“self”的适当方法是 '__typeof(self) __weak weakSelf = self;'为了有一个弱引用。
标签: objective-c memory-management objective-c-blocks