1

我有这个问题:块内的块。

  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+

4

1 回答 1

6

你很接近。只需更换您的解决方案

MyClass *mySelf = self;

self.createStuff = ^ (NSString *text) {       
     mySelf.post.onCompletion = ^(NSURLResponse *response, NSData *data, NSError *error) {
          [self doStuff];  // error here
     };
     [mySelf doMoreStuff];  
};

__weak MyClass *mySelf = self;

self.createStuff = ^ (NSString *text) {       
     mySelf.post.onCompletion = ^(NSURLResponse *response, NSData *data, NSError *error) {
          [self doStuff];  // error here
     };
     [mySelf doMoreStuff];  
};

第一个解决方案的问题mySelf是没有指定weak,所以它的所有权限定符是隐式的__strong参见 LLVM 的文档)。我不确定为什么这会消除第一个块中的警告,但指定引用__weak将完全删除保留周期。

于 2013-02-02T23:36:01.347 回答