【问题标题】:Objective-C accessors also available without @synthesize不使用 @synthesize 也可以使用 Objective-C 访问器
【发布时间】:2025-12-22 05:55:11
【问题描述】:

考虑以下代码:

@interface TestClass ()

@property NSString *privateProperty;

@end

现在,据我所知,要让编译器也创建访问器,我必须在 @implement-part 中添加 @synthesize 指令。

而且,如果不添加指令,以下消息有效:

[self setPrivateProperty:@"foo"];

据我了解,这应该会导致向我解释选择器未知的错误。为什么这个 setter(我认为也是 getter)仍然存在?

【问题讨论】:

    标签: objective-c setter getter synthesize


    【解决方案1】:

    从 xcode 4.5 开始,所有属性都将自动合成。

    【讨论】:

    • 其实这并不是Xcode的新特性。这是 LLVM 编译器的一个新特性,恰好随新版本的 Xcode 一起提供。如果你告诉 Xcode 使用不同的编译器,你就会失去这个特性。如果你用 LLVM 编译器编译你的代码,你也可以在没有 Xcode 的情况下获得这个特性。
    【解决方案2】:

    @property 声明声明了 getter 和 setter 方法的存在。 @synthesize 声明创建这些方法的实现。

    在 Xcode 4.5 之前,您会因为忽略 @synthesize 和运行时崩溃而收到编译器警告 - 两者都是由于您隐式声明的方法没有实现。

    从 Xcode 4.5 开始,除非您另外指定 (@dynamic),否则方法的实现会自动合成。

    【讨论】:

      【解决方案3】:

      这是 XCode 最新版本中引入的一项新功能:它自动对属性进行语法化,创建一个 _propertyName ivar 来存储它。

      【讨论】: