您的位置:首页 > 移动开发 > IOS开发

【iOS开发】 内存管理机制

2014-08-28 19:15 316 查看
OC使用了一种叫做引用计数的机制来管理对象

引用计数(reference counting)又称为保留计数(retaincounting),引用计数的数值表示有几个其它对象在使用它。

•每一个对象都拥有一个引用计数
•当对象被创建的时候,引用计数的值为1
•对你自己拥有的对象负责,你只能释放你自己的对象。
•对于遍历构造器和访问器来说,你没有通过上述的手段获得对象对象的所有权,因此在这些情况下你无须对获得的对象进行额外的释放操作。
•凡是你通过retain,alloc,copy等手段获得了所有权的对象。都必须在你不再使用它的时候,由你来调用release,autorelease等手段来释放对它的所有权。
•也可以理解为自己生成的对象,自己持有。非自己生成的对象,自己也能持有。不在需要自己持有的对象时释放。非自己持有的对象无法释放。
•生成并持有对象<alloc,new,copy,mutableCopy等>,持有对象<retain>,释放对象<release>,废弃对象<dealloc>。
•在一定的代码段内,对同一个对象所做的copy,alloc和retain的次数应该与autorelease和release的次数相等。

retain

•retain对应的是release,内存的释放用release。
•retain会使引用计数加1 。
•当发送retain消息的时候,该对象的引用计数加1,该对象的引用计数为2
•当这个对象发送release消息的时候,该对象的引用计数减1
•当一个对象的引用计数为0时,系统自动调用dealloc方法,销毁该对象。

assign

•不复制不保留,直接赋值
•assign不会使引用计数加1,也就是直接赋值。
•基本数据类型和本类不直接拥有的对象
•如果是类的delegate,推荐使用assign关键字,原因是避免了retain的死循环造成的对象无法真正的释放

copy

•copy建立一个索引计数为1的对象,在赋值时使用传入值的一份拷贝。
•浅层复制(copy):只复制指向对象的指针,而不复制引用对象本身。通过对象的指针来访问这个对象------只赋值地址。
深层赋值(mutableCopy):复制引用对象本身-----在创建一个对象,意思就是有一个A对象,复制一份得到Acopy后,对于浅复制来说,A和Acopy指向的是同一个内存资源,复制的,只不过是一个指针,对象本身资源,还是只有一件,那如果我们Acopy执行了修改操作,那么发现A引用的对象同样被修改,这其实违背了我们复制拷贝的一个思想。深复制就好理解了,内存中存在了两份独立对象本身。当修改A时,Acopy不变

alloc

alloc对应的是dealloc,内存的销毁用dealloc。

dealloc

•它的作用是,当对象的引用计数为0时,系统会自动调用dealloc方法,回收内存
•可以在dealloc的方法中释放你所占用的实例变量

autorelease

•自动释放池(Autorelease pool),是能够自动释放赤忠的对象的。NSObject类提供了一个autorelease消息,当我们想一个对象发送autorelease消息的时候,这个对象就会随着释放池的销毁而释放。
•自动释放池是以栈的形式实现的,当某个对象调用了autorelease方法时,该对象会被加入自动释放池的栈顶。对于发送了autorelease消息的对象,当自动释放池销毁时,自动释放池会对这些对象发送一条release消息,来释放他们。
autorelease只不过意味着预定延迟发送一条release信息,当前的引用计数并没有变。

readonly

•readonly此标记说明属性只可以读,也就是不能设置,可以获取。
•生成getter和setter两个方法
•变量可读取可修改

readwrite

•readwrite此标记说明属性会被当成读写的,这也是默认属性。
•只生成getter方法
•变量只读不可修改

atomic

•atomic:原子性访问
•可以保留在多线程环境下,能安全的存取值

nonatomic

•nonatomic:非原子性访问,多线程并发访问会提高性能

•不生成多线程同步内容

ARC

当你在编译程序的时候提供自动管理内存的功能,它会自动加入内存的控制代码,控制对象的生命周期,大大简化了内存管理的步骤,ARC管理内容的原理就是,编译器会在适当的地方自动插入retain、release和autorelease消息
•1)任何对象,如果仍有持有者,就不会销毁
•2)任何对象,已经没有任何持有者,即自动销毁
•3) 持有者就是指向对象的指针,如果是strong修饰的,即是对象的持有者,如果是weak属性的,则不是持有者

strong

•strong:打开ARC时才会使用,相当于retain。
strong只能修饰对象

weak

•weak:打开ARC时才会使用,相当于assign,
•weak只能修饰对象。
•当修饰的对象的引用计数为0时,对应的属性自动指向nil(防止野指针)

ARC机制的使用规则

• (1)不能调用dealloc,不能重写和调用retain,release,retainCount 和autorelease,dealloc虽然能够重写,但是不能调用[superdealloc]之类的方法
• (2)不能使用NSAllocateObjec或NSDeallocateObject函数来创建对象
• (3)不能在C语言的结构体中使用对象指针,同时建议用object-c的类来管理数据而不是结构体
• (4)不得使用NSAutoreleasePool对象。ARC中,全部使用@autorelease关键字代替,且比NSAutoreleasePool更高效
• (5)不得使用内存Zone,那些牵涉NSZone的方法都不得使用。
• (6)不得对一个属性变量的取值方法命名以new开头
• (7)outlet均用weak关键字修饰,除非他是xib中最顶部的界面元素,则需要strong。
(8)CoreFoundation不适合ARC,该创建的仍创建,该释放的仍释放

如果有错误,希望指出,待更新,使更加完善!!!谢谢。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: