我是块新手。我想创建一个 iVar NSMutableArray,我可以在块方法中访问它。有人可以告诉我如何使用 _block 关键字声明它吗?
@interface ViewController : UIViewController
{
__block NSMutableArray *array;
}
@property (nonatomic, weak) NSMutableArray *array;
我是块新手。我想创建一个 iVar NSMutableArray,我可以在块方法中访问它。有人可以告诉我如何使用 _block 关键字声明它吗?
@interface ViewController : UIViewController
{
__block NSMutableArray *array;
}
@property (nonatomic, weak) NSMutableArray *array;
您无需__block
在 iVar 前面设置 。
根据:http: //developer.apple.com/library/ios/#documentation/cocoa/conceptual/Blocks/Articles/bxVariables.html
复制块时,它会创建对块内使用的对象变量的强引用。如果在方法的实现中使用块:
- 如果通过引用访问实例变量,则会对 self 进行强引用;
- 如果您按值访问实例变量,则会对该变量进行强引用。
您通常不应该从除init
and之外的任何地方访问 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]);
}];