出于性能方面的原因,请尽可能不要在方法实现中使用自动释放的对象,特别是那些可能会在短时间内频繁执行的代码(例如在循环结构中,循 环次数未知并且可能是很多的情况)使用。举个例子,对于下面的情况,您不应该发送如下的消息: [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,则要根据具体情况决定。 |
|