默认情况下,任何block都是在栈中,随时可能会被回收。
对block设置copy属性,block的内存就会放到堆里面。
Book *b = [[Book alloc] init];
b.block = ^{
b.age = 20;
};
如果像上述写法block所指向的代码块会强引用Book的内存地址,使得Book对象不能释放,造成内存泄露。
Book *b = [[Book alloc] init];
// __weak Book *b2 = b;
__unsafe_unretained Book *b2 = b;
b.block = ^{
b2.age = 20;
};
如果这样写可以实现相同功能,并且不会造成内存泄露,__unsafe_unretained和__weak是弱引用,保证堆里面的Book可以被释放,从而block代码块也能被释放。