第五章:内存管理

对象的强引用原理:

-(void)setPeople:(People *)people{
    [people retain];
    [_people release];
    _people = people;
}

ARC除了在编译期自动添加retain、release、autorelease,还做了以下优化:
简化成对出现的retain、release
赋值情况:当前的值和将要赋值的值相同,共用一片内存地址的情况,如果只有当前值引用了这个对象,那么release后对象直接被释放,进行后面的操作会引起崩溃,ARC也可以避免这个问题。先保留新值,再释放旧值,避免了这个情况。

-(void)setUp{
    id temp = [People new];
    _people = [temp retain];
    [temp release];
}

ARC如何清理变量
回收object-c++对象时,待回收的对象会调用所有C++对象的析构函数(destructor),编译器发现C++对象,就会生成.cxx_destruct方法,ARC就借助此特性来清理内存。
对于CoreFoundation对象,则需要手动 CFRelease()、CFRetain()
对于malloc()生成的对象,手动free()

一般会生成一个对应的close方法,封装release操作

  • 技巧二十三:在dealloc方法中要做的事

释放指向其他对象的引用,取消kvo,通知。不要再做其他事
不要在dealloc中执行方法,特别是异步方法,因为对象已随时被销毁

  • 技巧二十四: 自动释放池的使用

自动释放池排布在栈中, 对象收到autorelease消息后,系统将其放置到最顶端的池子里,自动释放池也有收纳对象的作用
自动释放池降低内存峰值
@autoreleasepool可以创建出轻量级的自动释放池

  • 技巧二十五:不要使用retainCount

[people retainCount]不会考虑到后面自动缓存池的释放情况
系统可能进行释放优化,在引用计数为1的时候就释放对象
NSString和部分NSNumber(不包括浮点型),系统都设计为单例,通过标签指针管理,引用计数为2的63、64次方左右

你可能感兴趣的:(第五章:内存管理)