配色: 字号:
book_01
2018-11-19 | 阅:  转:  |  分享 
  
出于性能方面的原因,请尽可能不要在方法实现中使用自动释放的对象,特别是那些可能会在短时间内频繁执行的代码(例如在循环结构中,循
环次数未知并且可能是很多的情况)使用。举个例子,对于下面的情况,您不应该发送如下的消息:
[NSStringstringWithCharacters:]
而是应该发送下面的消息:
[[NSStringalloc]initWithCharacters:]
当您不再需要该字符串对象时,请显示地释放它。但是,请记住有些时候方法或者函数会返回自动释放的对象,这时您需要向对象发送
autorelease消息。
存取方法
在存取方法中作什么事情才是正确呢,这是个重要的问题。举个例子,假设您在一个获取方法中直接返回一个实例变量,而后立刻调用设置方
法,则在释放先前实例变量的时候就可能会有危险,因为它有可能把您之前返回的值给释放掉。Cocoa框架的原则是让设置方法自动释放实例变
量先前的值,但某些情况下,所涉及的某个设置方法会被频繁的调用(例如在一个很密集的循环中),这时候Cocoa的原则就不适用了。但在实践
中,这种情况非常罕见,除非是一些底层的对象才会如此。另外,诸如NSAttributedString、NSArray、以及NSDictionary这样的通用集合不会
自动释放对象,这主要是为了维护对象的存在时间。它们只是简单地留存或者释放其含有的对象。另外,它们也应该对这一事实进行归档,这样
客户程序就可以了解这些对象的行为。
对于现在正在编写的框架代码,我们建议在get方法中使用自动释放的对象,因为这是最安全的方法:
-(NSString)title{
return[[instanceVarretain]autorelease];
}

-(void)setTitle:(NSString)newTitle{
if(instanceVar!=newTitle){
[instanceVarrelease];
instanceVar=[newTitlecopy];
//orretain,dependingonobject&usage
}
}
另外,我们还需要考虑设置方法是使用copy方式还是使用retain方式。如果您所感兴趣的是对象的值而非实际对象本身,则请使用copy方式。一
个一般性的经验法则是对实现NSCopying协议的对象使用copy方式(您不应该在运行时检测对象是否实现NSCopying协议,而应该直接查找参
考文档)。通常情况下,诸如字符串、颜色、URL这样的对象应该能被复制;而像视图、窗口这样的对象则应该可以被保持。而至于其他的对象
(例如数组),是使用copy还是使用retain,则要根据具体情况决定。
献花(0)
+1
(本文系文理绿纱首藏)