【发布时间】:2011-04-23 03:03:06
【问题描述】:
作为许多 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.
}
在 getter 比 setter 更频繁地调用的情况下,技术 2 的性能明显优于技术 1。
块引用
好的,经过几分钟的深入思考,我最终理解了 Apple 所说的内容以及 [[title retain] autorelease] 的原因。但是,如果我想合成它,我该如何为 setter 指定它呢?我只知道将保留或复制作为设置器的访问器方法。例如:
@property (retain) NSString* title
每次我为标题设置新值时都会保留标题。但是如何指定 getter 将返回 [[title retain] autorelease] ,如示例一所示? XCode 是以这种方式隐式合成的吗?
问候, 苹果92
【问题讨论】:
标签: objective-c memory-management