与许多objc开发人员一样,我最终阅读并阅读了Apple内存管理编程指南,因为这是理解保留/释放/自动释放机制的最佳方式。
在这个页面中,有一个我不明白的例子:
块引用
技术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.
}
技术2的性能明显优于技术1,在这种情况下,调用getter的频率远远高于setter。
块引用
好的,经过几分钟的激烈思考后,我最终了解了Apple所说的内容以及[[title retain] autorelease]的原因。但是如果我想要合成它,怎么能为setter指定呢?我只知道保留或复制为setter的访问器方法。例如:
@property (retain) NSString* title
每次我为标题设置新值时,都会保留标题。但是如何指定getter将返回[[title retain] autorelease],如例1中那样?它是由XCode以这种方式隐式合成的吗?
此致 Apple92
答案 0 :(得分:3)
如果您正在使用@synthesize,则只要正确指定了属性选项(保留,复制等),就不需要关心getter和setter实现。编译器会为你做正确的事。
如果你真的想使用特定的getter或setter,只需在你的课上实现它。即使您有@synthesize语句,也会使用您的实现。或者,您可以实现getter和setter,并完全省略@synthesize语句。
或您可以在财产声明中specify the getter or setter accessor method name。