【问题标题】:Apple Memory Management Programming Guide / Hard exampleApple 内存管理编程指南 / 硬示例
【发布时间】:2011-04-23 03:03:06
【问题描述】:

作为许多 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.

}

在 getter 比 setter 更频繁地调用的情况下,技术 2 的性能明显优于技术 1。

块引用

好的,经过几分钟的深入思考,我最终理解了 Apple 所说的内容以及 [[title retain] autorelease] 的原因。但是,如果我想合成它,我该如何为 setter 指定它呢?我只知道将保留或复制作为设置器的访问器方法。例如:

@property (retain) NSString* title

每次我为标题设置新值时都会保留标题。但是如何指定 getter 将返回 [[title retain] autorelease] ,如示例一所示? XCode 是以这种方式隐式合成的吗?

问候, 苹果92

【问题讨论】:

    标签: objective-c memory-management


    【解决方案1】:

    如果您使用@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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多