您的位置:首页 > 移动开发 > Objective-C

[Objective-C] 003_内存管理

2015-05-31 23:13 447 查看
Objective-C内存管理,基本原理。

  1.[b]为什么要进行内存管理?[/b]

  由于移动设备的内存极其有限,所以分配每个APP使用的内存也是有限制的,app运行时内存占用较多的话,系统就会发出内存警告,严重时会强制关闭app.

  本质原因是因为对象和其他数据类型在系统中的存储空间不一样,其它局部变量主要存放于栈内存中,而对象存储于堆内存中,当代码块结束时这个代码块中涉及的所有局部变量会被回收,指向对象的指针也被回收,此时对象已经没有指针指向,但依然存在于内存中,造成内存泄露。

  2.对象的基本结构

  每个Objective-C对象都有引用计数器(专门有4个字节的存储空间来存储),是一个整数表示对象被引用的次数,即现在有多少东西在使用这个对象。对象刚被创建时,默认计数器值为1,当计数器的值变为0时,则对象销毁。

  3.引用计数器的作用

  判断一个对象是否要被回收的依据就是看计数器的值是否为0,若为0则销毁

  4.[b]引用计数器[/b]操作

  [object retain]:使object计数器+1

  [object release]:使object计数器-1

  [object retainCount]:获得object引用计数器值

  5.对象的销毁

  当object的引用计数器为0时,那么object将被销毁,object占用的内存被系统回收。当object被销毁时,系统会自动向object发送一条dealloc消息,一般会重写object的dealloc方法,在这里释放相关的资源,重写了dealloc方法就必须在代码块的最后调用[super dealloc],随后object存储空间被回收,记住不要手动向object 发送dealloc消息!

Objective-C内存管理原则

  1.谁创建,谁release

  如果你通过alloc,new,copy来创建了一个对象,那么你就必须调用release或者autorelease方法。不是你创建的就不用你去负责。

  2.谁retain,谁release

  只要你调用了retain,无论这个对象时如何生成的,你都要调用release

  3.有始有终,有增有减,[b]增减平衡。[/b]

Objective-C内存管理[b]代码规范[/b]

[b]  1.[b]只要调用了alloc,new,copy,就必须有release(autorelease)[/b][/b]

[b][b]  2.重写[b]dealloc方法一定要在最后调用[super dealloc];[/b][/b][/b]

@[b]property的参数相关[/b]

@property (nonatomic, assign) int age;
@property (nonatomic, retain) NSString *name;


[b]@property后的括号出现了四个特征性关键字:nonatomic , assign , retain , settet, 这些关键字直接告诉编译器后面的变量用何种方式来存取。[/b]

属性关键字使用范围释义是否是默认值小贴士
assign赋值方式不复制不保留,直接赋值YES基本数据类型和本类不直接拥有的对象

retain赋值方式将新值保留一份赋覆盖原值NO大部分对象可使用
copy赋值方式将新值复制一份赋覆盖原值NO字符串选择性使用
readwrite读写权限生成getter和setter两个方法YES变量可读取可修改
readonly读写权限只生成getter方法NO变量只读不可修改
atomic原子性原子操作YES可以保留在多线程环境下,能安全的存取值
nonatomic原子性非原子操作NO不生成多线程同步内容
getter存取方法自定义取方法NO
setter存取方法自定义赋值方法NO
关于nonatomic,如果我们能确定不需要多线程访问时,强烈推荐使用这个关键字,因为atomic对于性能的损失相对较大



本站文章为 宝宝巴士 SD.Team 原创,转载务必在明显处注明:(作者官方网站: 宝宝巴士 )
转载自【宝宝巴士SuperDo团队】 原文链接: /article/6669059.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: