【问题标题】:Is there an actual reason why do we have to use @synthesize?我们必须使用@synthesize 有实际原因吗?
【发布时间】:2012-07-24 15:25:18
【问题描述】:

所以我在头文件中使用了@property 键。

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

当然,根据Why we have to synthesize?,我们编写@synthesize 来生成get/set 方法。但我的问题是关于为什么标题中的@property 不够? 我问是因为每当我在标题中写@property 时,我都会立即转到实现并写@synthesize。所以对我来说,使用@synthesize 的唯一原因是补充@property 关键字。这似乎是多余的,让我假设@synthesize 不存在,因为它有其他用途。其他用途是什么?

【问题讨论】:

  • 实际上在 Xcode 和 LLVM 的下一次迭代中,您将不需要键入 synthesize。据我了解,它会自动合成您的属性。
  • @RyanPoolos:他们有没有提到他们为什么要做出这样的改变?
  • 在与 ios 6 一起发布的 Xcode 版本中,不再需要使用“@synthesize”,因为他们正在升级语言以包含“默认合成”和许多其他减少所需的代码量。
  • @Hassan,它只会生成您没有手动编写的访问器,这与 @synthesize 今天的行为方式相同。
  • @Hassan 您可以将@property 指定为只读,如果您只想要一个getter,仍然使用@synthesize

标签: objective-c


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 其实自动合成默认使用下划线前缀的ivar名称。如果你想合成/使用non-prefixed ivars,你必须明确@synthesize
  • @AndrewMadsen 你有消息来源吗?
  • 还请注意,您可以使用@dynamic 并自己添加方法,我认为不会自动假设@synthesize 更好,因为您可以通过@dynamic 获得真正只读的只读属性(仅实现getter)或者只是一般来说,两种不同方式实现这些属性的灵活性有助于
【解决方案2】:

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

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

这是给@property (nonatomic, retain)...

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

【讨论】:

    猜你喜欢
    • 2010-11-16
    • 2021-01-15
    • 2012-03-23
    • 2015-03-04
    • 1970-01-01
    • 2013-10-05
    • 1970-01-01
    • 1970-01-01
    • 2017-11-05
    相关资源
    最近更新 更多