Apple内存管理编程指南/硬盘示例

时间:2010-10-08 22:38:07

标签: objective-c memory-management

与许多objc开发人员一样,我最终阅读并阅读了Apple内存管理编程指南,因为这是理解保留/释放/自动释放机制的最佳方式。

在这个页面中,有一个我不明白的例子:

http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmAccessorMethods.html#//apple_ref/doc/uid/TP40003539-SW1

  

块引用

技术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

1 个答案:

答案 0 :(得分:3)

如果您正在使用@synthesize,则只要正确指定了属性选项(保留,复制等),就不需要关心getter和setter实现。编译器会为你做正确的事。

Unless you see actual perf problems regarding the getters and setters (which would be doubtful), I wouldn't worry about how it's implemented internally.


如果你真的想使用特定的getter或setter,只需在你的课上实现它。即使您有@synthesize语句,也会使用您的实现。或者,您可以实现getter和setter,并完全省略@synthesize语句。


您可以在财产声明中specify the getter or setter accessor method name