我是块新手。我想创建一个iVar NSMutableArray,我可以在一个块方法中访问它。有人可以告诉我如何使用_block关键字声明它吗?`
@interface ViewController : UIViewController
{
__block NSMutableArray *array;
}
@property (nonatomic, weak) NSMutableArray *array;
答案 0 :(得分:3)
您不需要在iVar前面设置__block
。
复制块时,会创建对对象的强引用 块内使用的变量。如果你在里面使用一个块 方法的实施:
- 如果您通过引用访问实例变量,则会对self进行强引用;
- 如果按值访问实例变量,则会对变量进行强引用。
答案 1 :(得分:0)
除了init
和dealloc
之外,您通常不应该访问任何内容中的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]);
}];