技术的乐趣在于分享,欢迎多多交流,多多沟通。
全部博文(877)
分类: iOS平台
2015-08-06 14:21:21
Objective-c使用alloc方法申请内存,使用Release来释放它。
一、内存申请(alloc)
当使用alloc创建一个对象时,需要在用完之个对象后释放(Release)它。
比如:
三、引用记数(retainCount)
整个Objective-c中都使用对象引用,而且每个对象有一个引用计数器retainCount。
当使用alloc(或者copy)方法创建一个对象时,其计数器的值增加1。
调用retain方法增加1,调用release方法就减少1。当计数器为0时,系统自动调用dealloc方法来释放内存中的对象。
如:
四、类成员变量
在大多数情况下,一个成员变量的setter方法应该仅仅autorelease/release旧对象,然后retain/copy新的对象,我们只需要在dealloc的时候调用release就可以了。
所以真正需要做的就是管理方法内部的局部变量的引用。如:
在上面的dealloc函数,如果写成下面的形式也是可以的:
如果写成下面的形式的话,就会产生内存泄露:
五、自动释放池 (autorelease)
创建自动释放池:
可以看出自动释放池跟任何其它普通对象没任何区别。
NSAutoreleasePool内部包含一个数组(NSMutableArray),用来保存声明为autorelease的所有对象。如果一个对象声明为autorelease,系统所做的工作就是把这个对象加入到这个数组中去。
它的作用和精髓就在于在声明pool后,release它之前的这段代码,所有段里的代码(先假设中间没有声明其它的AutoreleasePool实例),凡是调用了autorelase方法的实例,都会把它的retainCount加1,并在此pool实例中添1次此实例要回收的记录以做备案。当此pool实例dealloc时,首先会检查之前备案的所有实例,所有记录在案的实例都会依次调用它的release方法。如果此时数组中成员的retain count大于1,那么release之后,retain count大于0,此对象依然没有被销毁,内存泄露。
在代码中使用alloc的变量也是可以使用autorelease的,如:
另外需要注意的是,autorelease不是系统的垃圾收集(Garbage Collection)功能. 在iPad/iPhone中没有垃圾收集功能。
六、垃圾回收 (Garbage-collection)
垃圾回收(Gargage-collection)是Objective-c提供的一种自动内存回收机制。在iPad/iPhone环境中不支持垃圾回收功能。
当启动这个功能后,所有的retain,autorelease,release和dealloc方法都将被系统忽略。
七、copy, nonatomic
对于字符串类型的属性变量,我们经常使用下面的类似的语句:
八、内存管理的基本原则
1、如果使用alloc(或者copy)方法创建一个对象,或者使用retain保留一个对象,那么就要自己释放对象。
(1)用allco(或copy)时,用release释放。
(2)用retain时,用autorelase增加到自动释放池中。
2、申请内存的语句数量和释放内存的语句数量应该相等。
---------------------------------------------下面是从网上转载的---------------------------------------------------------------------------------------
1 口诀。
1.1 谁创建,谁释放(类似于“谁污染,谁治理”)。如果你通过alloc、new或copy来创建一个对象,那么你必须调用release或autorelease。换句话说,不是你创建的,就不用你去释放。
例如,你在一个函数中alloc生成了一个对象,且这个对象只在这个函数中被使用,那么你必须在这个函数中调用release或autorelease。如果你在一个class的某个方法中alloc一个成员对象,且没有调用autorelease,那么你需要在这个类的dealloc方法中调用release;如果调用了autorelease,那么在dealloc方法中什么都不需要做。
1.2 除了alloc、new或copy之外的方法创建的对象都被声明了autorelease。
1.3 谁retain,谁release。只要你调用了retain,无论这个对象是如何生成的,你都要调用release。有时候你的代码中明明没有retain,可是系统会在默认实现中加入retain。不知道为什么苹果公司的文档没有强调这个非常重要的一点,请参考范式2.7和第三章。
下面给出原文链接:iPhone/Mac Objective-C内存管理教程和原理剖析(一)基本原理
iPhone/Mac Objective-C内存管理教程和原理剖析(二)口诀与范式
原作者写不错,通俗易懂,值得一读,推荐一下,对初学者来说,是有帮助的。