ary*_*axt 6 memory-management objective-c objective-c-blocks
__weak MyClass *selfReference = self;
dispatch_async(dispatch_get_main_queue(), ^{
[selfReference performSomeAction];
});
Run Code Online (Sandbox Code Playgroud)
Fab*_*ser 12
1,2)块保留对象指针(任何块,dispatch_async块都没有什么特别之处).这通常不是问题,但可能导致保留周期,因为块可以与所有者对象关联,并且块(通常self)可以保留所有者对象.在这种情况下,您应该使用弱变量,然后将其重新分配给强捕获:
__weak MyClass *weakSelf = self;
self.block = ^{
MyClass *strongSelf = weakSelf;
...
[strongSelf ...];
[strongSelf.property ...];
[strongSelf->iVar ...];
}
Run Code Online (Sandbox Code Playgroud)
注意:如果直接访问iVar,编译器会将其转换为self-> iVar,从而保留自己!
3)块只保留指针,它们不复制它们.
4)块内创建的变量属于该块,并在该块超出范围时释放.