[objective-c基础]内存管理
内存管理 (memory management) 原本就是开发程序的一项重要课题,但为了让开发者更容易开发应用程序 (application) ,许多内存管理模式陆续被提出来

Objective-C 有数种内存管理方式,分别是
手动内存管理 (manual reference counting, MRC)
自动释放池 (autorelease pool)
垃圾回收 (garbage collection)
自动引用计数 (automatic reference counting, ARC)
垃圾回收则是伴随 Objective-C 2.0 出现的功能,需要在 Xcode 里设置,我们于此不特别讲解。 Xcode 4.2 以后可以使用自动引用计数,这是个相当强大的功能,使开发者无须担心内存管理的问题,系统会自动判断对象什么时候不再使用,从而释放该内存空间。
自动引用计数有几个要点
由编译器 (compiler) 决定何时使用 retain 、 release 、 autorelease
@property 改用 strong 、 weak 取代 retain 、 assign 等
NSAutoreleasePool 须改用 @autoreleasepool
Xcode 4.2 (iOS 5) 便是以自动引用计数为默认的内存管理模式,我们在这里介绍从手动内存管理到自动释放池的观念,讲解如何使用 retain 、 release 、 autorelease 等,使读者往后即便读到非 ARC 的源程序也能轻松读懂。
简单来说,凡是用 alloc 或是用 alloc 、 new 、 copy 、 mutableCopy 起始的方法名称建立对象 (object) 后,就得自行手动管理内存,也就是最后不需要使用该对象时,就得使用 release 或 autorelease 方法 (method) ,例如
- [[myObject alloc] init];
- ...
- ...
- [myObject release];
上例用 alloc 配置 myObject 的内存空间,然后用 init 初始化 myObject 对象,最后当 myObject 不需要使用时,便用 release 方法将其引用计数 (reference count) 递减。当 myObject 的引用计数递减到 0 之时,系统便会自动调用 myObject 的 dealloc ,释放 myObject 的内存空间。
注意:
引用计数可用 release 递减,也可用 retain 递增。 Cocoa 中也有些方法会递增、递减引用计数,例如 NSMutableArray 的 addObject: 与 UIView 的 addSubView: 会递增引用计数,而 NSMutableArray 的 removeObjectAtIndex: 与 UIView 的 removeFromSuperView: 会递减引用计数。
自动释放池将内存管理的责任一半给系统,另一半给开发者。使用自动释放池得先建立 NSAutoreleasePool 对象,例如 demo.m 中
- // 建立自动释放池对象, alloc 为配置内存区域, init 为初始化对象
- NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
同样的, alloc 配置 pool 的内存空间, init 为初始化 pool 对象。
接着在程序中所有建立的对象都需要使用 autorelease 方法
- // 传递 autorelease 信息给 NSString 字符串对象
- [s1 autorelease];
- [s2 autorelease];
- [s3 autorelease];
更简单是建立对象时直接使用 autorelease ,例如
- [[[myObject alloc] init] autorelease];
最后,程序执行结束前, pool 使用 drain 方法,使自动释放池释放所有内存空间
- // 传递 drain 信息给自动释放池对象
- [pool drain];
虽然现在的电脑都有足够多的内存,自己练习写的小程序消耗的内存也可能微不足道,但是没有适当的管理内存,很多时候会造成不可预期的错误,往后我们陆续说明 @property 必要的声明。
好了,内存管理大致介绍到这里,嗯,看了很多 myObject 、 pool 、 s1 、 s2 、 s3 会不会有点烦,这些都是变量 (variable) ,变量是 Objective-C 存放数值 (value) 的地方。
- 评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
-
