block本身是像对象一样可以retain,和release。但是,block在创建的时候,它的内存是分配在栈(stack)上,而不是在堆(heap)上。他本身的作于域是属于创建时候的作用域,一旦在创建时候的作用域外面调用block将导致程序崩溃。比如下面的例子。
我在view did load中创建了一个block:
- (void)viewDidLoad
{
[superviewDidLoad];
int number = 1;
_block = ^(){
NSLog(@"number %d", number);
};
}
并且在一个按钮的事件中调用了这个block:
- (IBAction)testDidClick:(id)sender {
_block();
}
此时我按了按钮之后就会导致程序崩溃,解决这个问题的方法就是在创建完block的时候需要调用copy的方法。copy会把block从栈上移动到堆上,那么就可以在其他地方使用这个block了~
修改代码如下:
_block = ^(){
NSLog(@"number %d", number);
};
_block = [_block copy];
同理,特别需要注意的地方就是在把block放到集合类当中去的时候,如果直接把生成的block放入到集合类中,是无法在其他地方使用block,必须要对block进行copy。不过代码看上去相对奇怪一些:
[array addObject:[[^{
NSLog(@"hello!");
} copy] autorelease]];
iOS Block自身的内存问题
最新推荐文章于 2021-05-14 17:05:16 发布