现在的位置: 首页 > 综合 > 正文

Objective-C 2.0内存管理

2014年10月29日 ⁄ 综合 ⁄ 共 1803字 ⁄ 字号 评论关闭

虽然 Objective-C 2.0 已经支持了垃圾收集了,但是 iPhone OS 中却不能使用它。所以我们需要自己来管理内存。Objective-C 的内存管理方式与使用引用计数的方式,就是说对象有一个计数器,引用对象一次,计数器加一,当计数器为0的时候,该对象的内存被释放。

创建对象实例的时候(init,alloc)应用计数加一,执行过程中,别的对象如果需要该对象,需要用(retain)来引用它,这时,该对象的应用计数器加一。不需要对象的时候用(release)来释放,这时引用计数器减一,当计数器为0的时候,释放该对象内存。

  1. init,alloc - 计数器 +1  
  2. retain - 计数器 +1  
  3. 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一下,就又回到了刚才退出时的状态。下面是一个例子:

  1. // MyKeyedArchiver.h  
  2. #import   
  3. @interface NSKeyedArchiver (MyKeyedArchiver)  
  4. - (void)encodeValueOfObjCType:(const char *)valueType at:(const void *)address;  
  5. @end  
  6. #import "MyKeyedArchiver.h"  
  7. @implementation NSKeyedArchiver (MyKeyedArchiver)  
  8. - (void)encodeValueOfObjCType:(const char *)valueType at:(const void *)address  
  9. {  
  10. NSMutableData *datas = [NSMutableData data];  
  11. NSArchiver *arch = [[NSArchiver alloc] initForWritingWithMutableData:datas];  
  12. [arch encodeValueOfObjCType:valueType  
  13. at:address];  
  14. [self encodeObject:[NSData dataWithData:datas]];  
  15. [arch release];  
  16. }  
  17. @end  
  18. // MyKeyedUnarchiver.h  
  19. #import   
  20. @interface NSKeyedUnarchiver (MyKeyedUnarchiver)  
  21. - (void)decodeValueOfObjCType:(const char *)valueType at:(void *)data;  
  22. @end  
  23. #import "MyKeyedUnarchiver.h"  
  24. @implementation NSKeyedUnarchiver (MyKeyedUnarchiver)  
  25. - (void)decodeValueOfObjCType:(const char *)valueType at:(void *)data  
  26. {  
  27. NSData *datas = [self decodeObject];  
  28. NSUnarchiver *unarch = [[NSUnarchiver alloc] initForReadingWithData:datas];  
  29. [unarch decodeValueOfObjCType:valueType  
  30. at:data];  
  31. [unarch release];  
  32. }  
  33. @end 

抱歉!评论已关闭.