使用目标c中的块声明iVar

时间:2012-12-19 14:21:08

标签: iphone

我是块新手。我想创建一个iVar NSMutableArray,我可以在一个块方法中访问它。有人可以告诉我如何使用_block关键字声明它吗?`

@interface ViewController : UIViewController
{
    __block NSMutableArray *array;
}
@property (nonatomic, weak) NSMutableArray *array;

2 个答案:

答案 0 :(得分:3)

您不需要在iVar前面设置__block

根据:http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/Blocks/Articles/bxVariables.html

  

复制块时,会创建对对象的强引用   块内使用的变量。如果你在里面使用一个块   方法的实施:

     
      
  • 如果您通过引用访问实例变量,则会对self进行强引用;
  •   
  • 如果按值访问实例变量,则会对变量进行强引用。
  •   

答案 1 :(得分:0)

除了initdealloc之外,您通常不应该访问任何内容中的ivars。所以几乎从来没有理由直接从一个区块内访问一个ivar。相反,在拥有ivar的对象上使用访问器(通常为self)。

对于多线程块,这看起来像这样:

__weak id weakself = self;
[obj doSomethingWithBlock:^{
   id strongself = weakself;
   strongself.array = nil; // Can't safely read from the array here without more code.
}];

如果这不是多线程操作,那么你可以这样做:

__weak id weakself = self;
[obj doSomethingWithBlock:^{
   NSLog(@"%@", weakself.array[0]);
}];

如果没有保留循环的危险(因为该块在此线程上立即执行),您可以更简单地执行此操作:

[obj doSomethingWithBlock:^{
   NSLog(@"%@", self.array[0]);
}];