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