从 C++ 到 Objective-C(16):内存管理(续三).doc_第1页
从 C++ 到 Objective-C(16):内存管理(续三).doc_第2页
从 C++ 到 Objective-C(16):内存管理(续三).doc_第3页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

从 C+ 到 Objective-C(16):内存管理(续三)作者:DevBean日期: 2011 年 04 月 01 日发表评论(3)查看评论GettersObjective-C 中,所有对象都是动态分配的,使用指针引用。一般的,getter 仅仅返回指针的值,而不应该复制对象。getter 的名字一般和数据成员的名字相同(这一点不同于 Java,JavaBean 规范要求以 get 开头),这并不会引起任何问题。如果是布尔变量,则使用 is 开头(类似 JavaBean 规范),这样可以让程序更具可读性。interface Button NSString* label; BOOL pressed;-(NSString*) label;-(void) setLabel:(NSString*)newLabel;-(BOOL) isPressed;endimplementation Button-(NSString*) label return label;-(BOOL) isPressed return pressed;-(void) setLabel:(NSString*)newLabel .end当返回实例数据指针时,外界就可以很轻松地修改其值。这可能是很多 getter 不希望的结果,因为这样一来就破坏了封装性。interface Button NSMutableString* label;-(NSString*) label;endimplementation Button-(NSString*) label return label; / 正确,但知道内情的用户可以将其强制转换成 NSMutableString, / 从而改变字符串的值-(NSString*) label / 解决方案 1 : return NSString stringWithString:label; / 正确:实际返回一个新的不可变字符串 / 解决方案 2 : return label copy autorelease; / 正确:返回一个不可变克隆,其值是一个 NSString(注意不是 mutableCopy)end循环 retain必须紧身避免出现循环 retain。如果对象 A retain 对象 B,B 和 C 相互 retain,那么 B 和 C 就陷入了循环 retain:A B C如果 A release B,B 不会真正释放,因为 C 依然持有 B。C 也不能被释放,因为 B 持有 C。因为只有 A 能够引用到 B,所以一旦 A release B,就再也没有对象能够引用这个循环,这样就不可避免的造成内存泄露。这就是为什么在一个树结构中,一般是父节点 retain 子节点,而子节点不 retain 父节点。垃圾收集器Objective-C 2.0 实现了一个垃圾收集器。换句话说,你可以将所有内存管理交给垃圾收集器,再也不用关心什么 retain、release 之类。但是,不同于 Java,Objective-C 的垃圾收集器是可选的:你可以选择关闭它,从而自己管理对象的生命周期;或者你选择打开,从而减少很多可能有 bug 的代码。垃圾收集器是以一个程序为单位的,因此,打开或者关闭都会影响到整个应用程序。如果开启垃圾收集器,retain、release 和 autorelease 都被重定义成什么都不做。因此,在没有垃圾收集器情况下编写的代码可以不做任何改变地移植到有垃圾收集器的环境下,理论上只要重新编译一遍就可以了。“理论上”意思是,很多情况下涉及到资源释放处理的时候还是需要特别谨慎地对待。因此,编写同时满足两种情况的代码是不大容易的,一般开发者都会选择重新编写。下面,我们将逐一解释这两者之间的区别,这些都是需要特别注意的地方。finalize在有垃圾收集器的环境下,对象的析构顺序是未定义的,因此使用 dealloc 就不大适合了。NSObject 增加了一个 finalize 方法,将析构过程分解为两步:资源释放和有效回收。一个好的 finalize 方法是相当精妙的,需要很好的设计。weak, strong很少会见到 _weak 和 _strong 出现在声明中,但我们需要对它们有一定的了解。默认情况下,一个指针都会使用 _strong 属性,表明这是一个强引用。这意味着,只要引用存在,对象就不能被销毁。这是一种所期望的行为:当所有(强)引用都去除时,对象才能被收集和释放。不过,有时我们却希望禁用这种行为:一些集合类不应该增加其元素的引用,因为这会引起对象无法释放。在这种情况下,我们需要使用弱引用(不用担心,内置的集合类就是这么干的),使用 _weak 关键字。NSHashTable 就是一个例子。当被引用的对象消失时,弱引用会自动设置为 nil。Cocoa 的 Notication Center 就是这么一个例子,虽然这已经超出纯 Objective-C 的语言范畴。NSMakeCollectable()Cocoa 并不是 Mac OS X 唯一的 API。Core Foundation 就是另外一个。它们是兼容的,可以共享数据和对象。但是 Core Foudation 是由纯 C 编写的。或许你会认为,Objective-C 的垃圾收集器不能处理 Core Foundation 的指针。但实际上是可以的。感兴趣的话可以关注一下 NSMakeCollectable

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论