3

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

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

2 回答 2

3

您无需__block在 iVar 前面设置 。

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

复制块时,它会创建对块内使用的对象变量的强引用。如果在方法的实现中使用块:

  • 如果通过引用访问实例变量,则会对 self 进行强引用;
  • 如果您按值访问实例变量,则会对该变量进行强引用。
于 2012-12-19T14:33:31.387 回答
0

您通常不应该从除initand之外的任何地方访问 ivars dealloc。所以几乎没有理由直接从块内访问 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]);
}];
于 2012-12-19T15:01:53.030 回答