9

所以我@property在我的头文件中使用密钥。

如果我这样做,我应该@synthesize在我的实现中使用密钥,对吗?但我想知道,是否有我必须这样做的实际原因?我只是想知道为什么@property在标题中写入的内容不足以让代码知道我的意图(自动生成 get/set 方法)。

当然,根据我们为什么要合成?我们编写@synthesize来生成 get/set 方法。但我的问题是为什么@property标题中的内容不够?我问是因为每当我@property在标题中写入时,我都会立即去实现并编写@synthesize. 所以对我来说,唯一的原因@synthesize是用来补充@property关键字。这似乎相当多余,让我假设@synthesize如果不是因为它有其他用途,它就不会存在。那些其他用途是什么?

4

2 回答 2

5

@synthesize做两件事。它生成 getter/setter 对并为属性创建 iVar。

在这两件事中,我认为创建 iVar 是我何时使用@synthesize和何时不使用的关键。当为未在内部存储为 iVars 的成员创建属性时,(显然)我不使用@synthesize.

即将推出的自动合成功能不会有太大帮助。我总是用前导“_”来命名我的 iVar,因此我仍然需要明确地合成它们。

请参阅@AndrewMadsen 链接:看起来 '_' 前缀自动合成将生成 iVar。

哇!不用说,我现在对自动合成更兴奋了!!

于 2012-07-24T15:46:15.533 回答
0

当它为实例变量生成 getter 和 setter 时,既可以在内部使用,也可以在类外部使用,真正的魔力在于 setter,因为它执行以下操作:

- (void)setValue: (id)newValue
{
    if (value != newValue)
    {
        [value release];
        value = newValue;
        [value retain];
    }
}

这是为了一个@property (nonatomic, retain)...

真正的魔力在于,每次设置实例变量(从对象本身内部或外部)时,您要确保您拥有传递的 newValue(带有保留),释放旧值并设置新值。
因此可以多次设置实例变量,而无需手动释放旧的。那只是一个速度选项:-)

于 2012-07-24T16:06:01.420 回答