作为许多objc开发人员,我最终反复阅读了《苹果内存管理编程指南》,因为这是理解保留/释放/自动释放机制的最佳方式。
在这一页中,有一个我不理解的例子:
大宗报价
技术1
在技术1中,getter返回的值在调用范围内自动释放:
- (NSString*) title {
return [[title retain] autorelease];
}
- (void) setTitle: (NSString*) newTitle {
if (title != newTitle) {
[title release];
title = [newTitle retain]; // Or copy, depending on your needs.
}
}
因为从get访问器返回的对象在当前作用域中是自动释放的,所以如果属性值发生更改,它仍然有效。这使得访问器更加健壮,但代价是额外的开销。如果期望频繁调用getter方法,那么保留和自动释放对象所增加的成本可能不值得付出性能成本。
技术2
与技术1一样,技术2也使用自动释放技术,但这次是在setter方法中使用:
- (NSString*) title {
return title;
}
- (void) setTitle: (NSString*) newTitle {
[title autorelease];
title = [newTitle retain]; // Or copy, depending on your needs.
}
在getter比setter更频繁地被调用的情况下,技术2的性能明显优于技术1。
大宗报价
好吧,经过几分钟的激烈思考,我终于明白了苹果公司的说法,以及拥有[[title retain]autorelease]的原因。但是,如果我想合成它,我如何为setter指定它呢?我只知道setter的retain或copy as访问器方法。例如:
@property (retain) NSString* title
每次我为title设置新值时,都会保留title。但是,如何指定getter将返回[[title retain]autorelease],如示例一所示?它是通过XCode以这种方式隐式合成的吗?
Regards, Apple92