【发布时间】:2013-02-02 23:19:53
【问题描述】:
我有这个问题:块中的块。
self.createStuff = ^ (NSString *text) {
self.post.onCompletion = ^(NSURLResponse *response, NSData *data, NSError *error){
[self doStuff]; // error here
};
[self doMoreStuff]; // error here
};
我会在 [self doStuff] 和 [self doMoreStuff] 中出现错误。错误是在此块中强烈捕获“自我”可能导致保留周期
说起来简单,加个就行了
id mySelf = self;
在第一个块之前并使用 mySelf。
不。这不会解决我的问题,仅仅是因为 mySelf 是一种 id 不会给我第二行需要的 post 属性。所以我需要像这样声明它
MyClass *mySelf = self;
把它变成这样:
MyClass *mySelf = self;
self.createStuff = ^ (NSString *text) {
mySelf.post.onCompletion = ^(NSURLResponse *response, NSData *data, NSError *error){
[self doStuff]; // error here
};
[mySelf doMoreStuff];
};
好的,你说,现在 self.post.onCompletion 行和 doMoreStuff 不再抱怨了,但是我们在 onCompletion 内部有了另一个 self... 因为这是块中的块。我可以重复创建另一个弱引用的过程,例如,这必须是对弱引用的弱引用
MyClass *internalMyself = mySelf;
并使用
[internalMyself doStuff];
在我看来,这似乎是一种非常可悲的方法,而且当此方法运行时,应用程序会挂起。在方法执行之前,像引用之类的东西正在被释放......
我该如何解决这个字谜?
谢谢。
注意:正在编译到 iOS 6+
【问题讨论】:
-
嗯,现在是我关掉 ARC 的时候了。
-
拥有一个非 ARC 类和无数其他类 ARC 会更可悲。
-
@H2CO3:这与 ARC 无关。保留周期也发生在 MRC 中。
标签: iphone ios ipad objective-c-blocks