虽然 Objective-C 2.0 已经支持了垃圾收集了,但是 iPhone OS 中却不能使用它。所以我们需要自己来管理内存。Objective-C 的内存管理方式与使用引用计数的方式,就是说对象有一个计数器,引用对象一次,计数器加一,当计数器为0的时候,该对象的内存被释放。
创建对象实例的时候(init,alloc)应用计数加一,执行过程中,别的对象如果需要该对象,需要用(retain)来引用它,这时,该对象的应用计数器加一。不需要对象的时候用(release)来释放,这时引用计数器减一,当计数器为0的时候,释放该对象内存。
- init,alloc - 计数器 +1
- retain - 计数器 +1
- release - 计数器 -1
另外如果不使用 retain,release,可以使用(autorelease)来自动释放对象。
容器
Objective-C 中的容器主要有以下3种:
数组
字典
Set
向容器中添加的内容不能直接用 int 或 float,需要通过 NSNumber 等封装类来实现。Objective-C 2.0 开始可以使用迭代子(Enumerator),来顺序访问容器中的元素。
Notification
Notification是消息通知的功能。具体使用 NSNotificationCenter 类。将需要接受通知的对象,方法,事件注册到该类上。
归档(Archive)
归档是指将对象的内存布局原样地保存到文件系统上。同样对应的由文件中的数据生成对象叫做UnAchive。在 iPhone SDK 中使用 NSKeyedArchiver 和 NSKeyedUnarchiver 类来实现。
一般在程序结束的时候,保存当前的状态,再次启动的时候UnAchive一下,就又回到了刚才退出时的状态。下面是一个例子:
- // MyKeyedArchiver.h
- #import
- @interface NSKeyedArchiver (MyKeyedArchiver)
- - (void)encodeValueOfObjCType:(const char *)valueType at:(const void *)address;
- @end
- #import "MyKeyedArchiver.h"
- @implementation NSKeyedArchiver (MyKeyedArchiver)
- - (void)encodeValueOfObjCType:(const char *)valueType at:(const void *)address
- {
- NSMutableData *datas = [NSMutableData data];
- NSArchiver *arch = [[NSArchiver alloc] initForWritingWithMutableData:datas];
- [arch encodeValueOfObjCType:valueType
- at:address];
- [self encodeObject:[NSData dataWithData:datas]];
- [arch release];
- }
- @end
- // MyKeyedUnarchiver.h
- #import
- @interface NSKeyedUnarchiver (MyKeyedUnarchiver)
- - (void)decodeValueOfObjCType:(const char *)valueType at:(void *)data;
- @end
- #import "MyKeyedUnarchiver.h"
- @implementation NSKeyedUnarchiver (MyKeyedUnarchiver)
- - (void)decodeValueOfObjCType:(const char *)valueType at:(void *)data
- {
- NSData *datas = [self decodeObject];
- NSUnarchiver *unarch = [[NSUnarchiver alloc] initForReadingWithData:datas];
- [unarch decodeValueOfObjCType:valueType
- at:data];
- [unarch release];
- }
- @end