【发布时间】:2026-01-05 13:25:01
【问题描述】:
我一直在阅读有关内存管理的苹果文档,现在对推荐的访问器实现有点困惑。 Apple 引用了 3 种实现访问器的方法。
技巧1
我从第一种技术中复制了代码,该技术反映:“Getter 在返回值之前保留并自动释放该值;setter 释放旧值并保留(或复制)新值。”第一种技术据说更健壮,但在频繁调用的 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.
}
}
跳跃技巧2
技巧3
第三种技术更适合经常调用的 setter 和 getter。这也是我一直遵循的方法。
- (NSString*) title {
return title;
}
- (void) setTitle: (NSString*) newTitle {
if (newTitle != title) {
[title release];
title = [newTitle retain]; // Or copy, depending on your needs.
}
}
我的问题是:
(技术 1)setter 首先释放现有值,即使它没有指向任何东西。这将向 nil 发送一条消息,据我所知,Objective-C 支持该消息,但看起来仍然很奇怪。我理解正确吗?
(技术 1)为什么要在自动释放中堆叠保留?
(技术 1)使用 getter 的调用者是否应该在对象完成后调用 release?
苹果开发者文档页面位于:Memory Management Programming Guide - Accessor Methods
【问题讨论】:
-
技巧4:使用合成属性。标准合成属性大致相当于技术 1,但也具有互斥锁,
nonatomic合成属性相当于技术 3。
标签: objective-c memory-management accessor