内存管理

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

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

调用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操作就可能导致系统将此对象永久回收,

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

相关阅读更多精彩内容

  • 29.理解引用计数 Objective-C语言使用引用计数来管理内存,也就是说,每个对象都有个可以递增或递减的计数...
    Code_Ninja阅读 5,485评论 1 3
  • 内存管理 简述OC中内存管理机制。与retain配对使用的方法是dealloc还是release,为什么?需要与a...
    丶逐渐阅读 6,067评论 1 16
  • 内存管理是程序在运行时分配内存、使用内存,并在程序完成时释放内存的过程。在Objective-C中,也被看作是在众...
    蹲瓜阅读 8,462评论 1 8
  • iOS内存管理 概述 什么是内存管理 应用程序内存管理是在程序运行时分配内存(比如创建一个对象,会增加内存占用)与...
    蚊香酱阅读 11,010评论 8 119
  • 小花园 1、向光性实验1组 材料:纸盒,自备 彩纸,淘宝 白板,淘宝 2、彩色树叶若干(卡...
    爱睡觉的萝卜阅读 1,418评论 0 0

友情链接更多精彩内容