ARC规则-规则

所有内容引用自《Objective-C 高级编程 iOS与OS X多线程和内存管理》,加入了自己的部分理解。

本节小结,点小1跳到底部[1]


  • 不能使用retain/release/retainCount/autorelease
  • 不能使用NSAllocateObject/NSDeallocateObject
  • 须遵守内存管理的方法命令规则
  • 不要显示调用dealloc
  • 使用@autoreleasepool块替代NSAutoreleasePool
  • 不能使用区域(NSZone)
  • 对象型变量不能作为C语言结构体(struct/union)的成员
  • 显示转换idvoid *
部分解释
对象型变量不能作为C语言结构体(struct/union)的成员

例如这样就是不允许的

struct Data{
    NSArray *array;
};

原因: C语言没有方法管理结构体成员的生存周期。
ARC环境中编译器管理内存,必须知道对象的生命周期。但C结构体不在管理范围内,所以不能直接使用。

可加上__unsafe_unretained修饰,让变量不属于编译器管理的对象。需要自己管理,注意内存泄露。

显示转换id和void*

如果转换?(为啥要转换?还不知道)

id obj = [[NSObject alloc] init];
void *p = (__bridge void *)obj;
id o = (__bridge id)p;

注: __bridge void *这种转换跟__unsafe_unretained一样不安全,容易产生悬垂指针导致crash

__bridge_retained 相当于 retain
__bridge_transfer 相当于 release

为啥要转换? 因为Objective-CCore Foundation对象之间相互变换就需要用到。

Objective-C对象和Core Foundation对象没有区别,ARC无效时,可以用简单的C语言的转换也能实现互换。

因为转换不需要额外的CPU资源,所以也叫免费桥(Toll-Free Bridge)

属性

属性声明的属性与所有权修饰符的对应关系

属性声明的属性 所有权修饰符
assign __unsafe_unretained修饰符
copy __strong修饰符(赋值的是被复制的对象)
retain __strong修饰符
strong __strong修饰符
unsafe_unretained unsafe_unretained修饰符
weak __weak修饰符

小结

主要有一个规则、一个属性对应关系


  1. 😊假装是锚点的脚注

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 不记得看过的第一部科幻片是什么了。也许是星球大战,也许是恐龙特急克塞号。记忆最深刻的太空堡垒,男主的飞船失事,只能...
    屡空阅读 419评论 1 1
  • 总是和你吵架 但从没想要分开 总是取笑你 但从没嫌弃过 总是口是心非 是想让你看懂我的内心 总是矫情偶尔发疯 可一...
    哀慕熙荣阅读 113评论 0 1
  • 每天使用1%的时间,进步1%,成为1%的人! 日出:6:52 日落:17:40 起床:5:00 ...
    煜宝阅读 238评论 0 1
  • 苍蝇不叮无缝的蛋—— 下午没事科室里拉呱,女医生唠叨对婆婆不满,男医生说她:苍蝇不叮无缝的蛋,你别光说别人。 女医...
    范末末阅读 360评论 0 0

友情链接更多精彩内容