内存管理

应用程序在其生命周期中会创建很多对像,这些对象都相互联系着,这些相互关联的对象就构成了一张”对象图“,对象如果持有指向其他对象的强引用,那么前者就拥有会者。

对象所占用的内存在解除分配之后,只是放回可用内存池,如果执行时尚未复写对象内存,那么该对象扔然有效。

调用release会立刻递减对象的保留计数而且还有可能令系统回收此对象,然而有时候可以不调用他,改为调用autorelease,此方法会在稍后递减计数。

autorelease能延长对象生命期,使其在跨越方法调用边界后依然可以存活一段时间。

引用计数机制通过可以递增递减的计数器来管理内存,对象创建好之后,其保留计数至少为1,若保留计数为正,则对象继续存活,当保留计数降为0时,对象就销毁了。

clang编译器项目带有一个"静态分析器",用于致命程序里引用计数出问题的地方。

ARC管理对象生命周期的办法基本就是:在合适的地方插入”保留“及”释放“操作,在ARC环境下,变量的内存管理语义可以通过修饰符指明,而原来则需要手工执行保留和释放操作。

ARC只负责oc对象的内存,corefoundation管不了。

在dealloc方法里,应该做的事情就是释放指向其他对象的引用,并取消原来订阅的通知,不要做其他任何事。

如果对象持有文件描述符等系统资源,那么应该专门编写一个方法来释放此种资源,这样的类要和其他使用者约定,用完资源后必须调用close方法。

执行异步任务的方法不应该在dealloc里调用。只能在正常状态下执行的那些方法也不应该在dealloc里调用。因为此时对象已经处于正在回收的状态里。

捕获代码时,一定要注意将try块内所创立的对象清理干净。

在默认情况下。arc不生成安全处理异常所需要的清理代码,开启编译器标志后,可生成这种代码,不过会导致应用程序变大,而且会降低运行效率。

将某些引用设为weak,可以避免出现保留环

unsafe_unretained 与weak属性,再起所指的对象回收以后表现出来的行为不同,unsafe_unretained属性扔然指向那个已经回收的实例,而weak属性则指向nil。

自动释放池排布在栈中。对象收到autorelease消息后。系统将其放入最顶端的池里

开启僵尸对象方法:编辑应用程序scheme,在对话框左侧选择run,然后切换至diagnostics,勾选enable zombie objects。

- (void)setFoo:(id)foo{

[foo retail];

[_foo release];

_foo = foo;

}

strong 类型指针。此方法将保留新值并释放旧值,然后更新实例变量,另其指向新值,加入还未保留新值就是放旧值,而且两个值又指向同一个对象,那么先执行release操作就可能导致系统将此对象永久回收,

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