ITKeyword,专注技术干货聚合推荐

注册 | 登录

【Objective-C高级编程】iOS与OS X多线程和内存管理(九) Block 循环引用

mad2man 分享于 2014-03-22

推荐:【Objective-C高级编程】iOS与OS X多线程和内存管理(三) Block语法

1.  Block 就是带有自动变量值的匿名函数。  Block 语法的简单示例: ^void ( int enent ) { printf("buttonId:%d, event=%d",i,event);} 完整形式的Block语法

2020腾讯云共同战“疫”,助力复工(优惠前所未有!4核8G,5M带宽 1684元/3年),
地址https://cloud.tencent.com/act/cps/redirect?redirect=1053

2020阿里云最低价产品入口,含代金券(新老用户有优惠),
地址https://www.aliyun.com/minisite/goods

在Block 中使用附有 __strong 修饰符的对象类型自动变量,那么当Block从栈复制到堆时,该对象为Block 所持有。 这样容易引起循环引用。

typedef void (^blk_t)(void);
@interface MyObject : NSObject
{
     blk_t blk;
}
@end
@implementation MyObject
- (id)init
{
     self = [super init];
     blk = ^{ NSLog(@“self = %@“,self); };
     return self;
}
@end
int main()
{
     id o = [[MyObject alloc] init];
     NSLog(@“%@“,o);
     return 0;
}


以上MyObject 的dealloc()一定没有被调用。 因为self 持有 Block,而Block 持有self; 避免循环引用,

推荐:【Objective-C高级编程】iOS与OS X多线程和内存管理(五) Blocks 截获自动变量值

int main (){ int dmy = 256; int val = 10; const char *fmt = “val = %d”; void (^blk)(void) = ^{ printf(fmt, val); };

使用 __weak 修饰符。
- (id)init
{
     self = [super init];
     id __weak tmp = self;
     blk = ^{ NSLog(@“self = %@“,tmp); };
     return self;
}

  ARC 有效无效的情况下,__block 说明符的影响区别很大。 ARC 无效时,__block 说明符被用来避免Block中的循环引用。 这是由于当 Block 从栈复制到堆时, 若 Block 使用的变量为 附有 __block 说明符的id类型或对象类型的自动变量,不会被retain; 若 Block 使用的变量为 没有 __block 说明符的id类型或对象类型的自动变量,则被retain;












推荐:【Objective-C高级编程】iOS与OS X多线程和内存管理(二)

1.属性声明与所有权修饰符的对应关系 属性声明: 所有权修饰符 assign :__unsafe_unretained copy :__strong retain :__strong strong :__strong unsafe_unr

在Block 中使用附有 __strong 修饰符的对象类型自动变量,那么当Block从栈复制到堆时,该对象为Block 所持有。 这样容易引起循环引用。 typedef void (^blk_t)(void);@interface MyObject : NS

相关阅读排行


相关内容推荐

最新文章

×

×

请激活账号

为了能正常使用评论、编辑功能及以后陆续为用户提供的其他产品,请激活账号。

您的注册邮箱: 修改

重新发送激活邮件 进入我的邮箱

如果您没有收到激活邮件,请注意检查垃圾箱。