1.ARC

2017-05-08  本文已影响0人  写代码写到人生巅峰

1.编译器特性 编译器完全清楚对象,并能立刻释放那些不再使用的对象(实际还是需要运行时库的帮助)

2.内存管理的思考方式

以下arc和非arc都是有效的

  自己生成的对象,自己持有 alloc、new、copy、mutableCopy。
  非自己生成的对象,自己也能持有,使用retain方法可以持有对象。
  不在需要持有的对象,持有者有义务释放 release autorelease使对象超出指定生存范围能自动并正确的释放。
  无法释放非自己持有的对象

3.alloc\retain\release\dealloc

调用alloc或是retain方法之后,引用计数加1
调用release之后,引用计数减1
引用计数为0时,调用dealloc方法废弃对象

GNUStep:在OC对象中存有引用计数这一整数值,能够统一管理内存块与对象用内存块
Apple: 引用计数记录保存在引用计数表中,引用计数记录存有内存块地址,可以追溯到对象的内存块地址

autorelease使用
生成并持有NSAutoreleasePool对象
调用已分配对象的autorelease实例方法
废弃NSAutoreleasePool对象

4.所有权修饰符

内存泄露:应当废弃的对象在超出其生命周期后继续存在
-fno-objc-arc

__strong: id和所有对象类型默认的所有权修饰符 __strong修饰的对象超出其作用域,强引用失效;__strong不仅仅在变量的作用域中,在赋值上也能够正确的管理对象的所有者。
__weak: 避免循环引用,造成内存泄露。 通过检查附有__weak修饰符的变量是否为nil,可以判断被赋值的对象是否已经废弃,
__unsafe_unretained:  修饰的变量不属于编译器的内存管理对象; 变量表示的对象
__autoreleasing 修饰的变量等价于在ARC无效时调用对象的autorelease方法,对象被注册到autoreleasepool。

5.ARC规则

1.不能使用retain、release、retainCount、autorelease
2.不能使用NSAllocateObject/NSDeallocateObject
3.必须遵守内存管理的方法命名规则
4.不要显式的调用dealloc
5.使用@autoreleasepoool代替NSAutoreleasepool
6.不要使用区域
7.对象变量不能作为C语言结构提的成员
8.显式转换id和void *
上一篇下一篇

猜你喜欢

热点阅读