块中bool的弱定义

时间:2013-09-27 15:59:34

标签: objective-c block

要为块中的对象定义弱引用,请使用类似

的内容
MyViewController *__weak weakSelf= self;
UILabel *__weak weakLabel=ALabel;

///the block code with some examples
up2.completionBlock = ^(NSDictionary *headers, NSString *responseString) { 

   [weakSelf aMethodInTheController];
   [weakLabel setHidden:NO];


};

我对bool有问题,我如何声明对bool的弱引用以避免警告“在此块中强烈捕获自身可能会导致保留周期”? 不适用于:

Bool *__weak weakFlag=Aflag;

1 个答案:

答案 0 :(得分:0)

嗯,你在这里尝试做什么并不明显。

有两种可能性。也许您需要将参数传递给块。所以有一个boolBOOL类型的变量(它们在这个问题上是相似的),你想在块中使用它。

然后,好消息!你根本不需要任何东西。只需声明

  BOOL some_bool = (YES or NO or some calculation);

稍后在块中使用它。这是有效的,因为布尔类型是原始的(它们是某种整数),并且不够聪明,无法参与内存管理。所以编译器并不担心;它只是在创建块时抓取此变量的值并将其复制到块中。

这是the relevant documentation

  

除非您另行指定,否则仅捕获该值。这意味着如果在定义块的时间和调用块的时间之间更改变量的外部值,...

或者,也许您希望拥有一个可以获取逻辑值的变量,并且可以在创建块和运行时间之间由其他对象更改。在这种情况下,你需要

  1. 将布尔值包装到NSNumber
  2. 在对象的某处存储对此NSNumber的强引用
  3. 将其作为指向块的弱指针
  4. 传递

    E.g。

    // somewhere in the interface
    @property NSNumber *someImportantFlag
    
     __weak NSNumber *weakFlag = someImportantFlag;
     ... ^{ ... if(weakFlag.boolValue) ... weakFlag = @(NO); ...} 
    

    感谢评论者让我重新阅读了问题和答案。