我有这个问题:块内的块。
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+