在 Objective-C 中在哪里编写 @property 指令?

Posted

技术标签:

【中文标题】在 Objective-C 中在哪里编写 @property 指令?【英文标题】:Where to write @property directive in Objective-C? 【发布时间】:2012-07-31 18:14:42 【问题描述】:

代码1

@interface Rectangle : NSObject   

    int width,height;

@property int width,height;

code2

@interface Rectangle : NSObject
@property int width,height;

    int width,height;

谁能告诉我,他们之间有什么不同?在@property 中,我已经为widthheight 添加了int。为什么要在大括号中再次声明?

更新: 我使用的是 osx 10.8 64bit。

【问题讨论】:

其中一个是否有问题,或者您只是不确定为什么需要将其声明为属性并在括号中? 如果我输入 init width,height,我会得到一些错误。 如果你把int width,height;放在哪里你会得到什么错误?尝试更具体。 区别在于第二个是非法的。 【参考方案1】:

您不必重新声明,只需使用:

@interface Rectangle : NSObject
@property int width,height;
@end

【讨论】:

提问者没有指定操作系统。您所说的在 Mac OS X 上通常不正确。 哦!抱歉,是的,这绝对是 ios 版。我猜是习惯的力量。 @torrey.lyons:自 10.6 以来,在 OS X 上明确声明 ivars 是不必要的。只有在构建 32 位应用程序时才能合成 ivars。 @JoshCaswell 没错。我在回答中给出了确切的要求。对于它的价值,我们的 Mac 应用程序确实针对 32/64 位,因此我们被要求声明 ivars。【参考方案2】:

在您的示例中,“code1”是正确的,但可能不需要,而“code2”不正确,无法编译。任何实例变量都需要直接在@interface 行之后用大括号声明,这就是第二个示例错误的原因。

正如其他人所提到的,您可能根本不需要声明 widthheight。如果您使用的是现代运行时,编译器可以从 @property 语句中得知您打算为该属性创建一个底层实例变量,并将为您创建这些实例变量。另一方面,对于较旧的遗留运行时,必须显式声明 widthheight 等实例变量。您没有指定您的平台,因此不清楚您的情况是否需要它。

iOS 上总是使用现代运行时,这就是为什么这里很多人会错误地告诉你,实例变量在任何情况下都不需要声明。在 Mac OS X 上,现代运行时与 10.5 或更高版本中的 64 位代码一起使用。如果您使用的是 32 位代码或旧版本,则需要显式声明实例变量。

【讨论】:

谢谢。对于刚接触 objc 的人来说真的很有帮助。【参考方案3】:

大括号内的名称是实例变量,可能会或可能不会用作匹配属性的后备存储。这取决于您如何编写 @synthesize 语句。

我宁愿根本没有显式的实例变量。我在这种情况下使用它们的唯一原因是为了使调试更容易。

【讨论】:

只是好奇,声明显式 ivars 对调试有何帮助?符号显示更可靠吗? 在 Xcode 4.2 中(至少)合成的实例变量没有显示(或不一致)在拥有对象下的显示窗口中。 gdb 和 lldb 在控制台中也遇到了各种问题,其中合成变量的“po”或点表示法属性引用。 (我刚刚迁移到 4.4,并且对是否有调试器修复非常感兴趣……种类繁多。)【参考方案4】:

它们的区别在于第一个是对的,第二个是错的。即使第二个代码编译,这也不是您应该编写代码的方式。始终将所有属性声明放在​​ ivars 之后(大括号中的内容。@property 不声明变量(在大括号中完成)。@property 指令向编译器提供有关如何生成 getter 的说明和 setter 方法,当你使用 @synthesize 指令时,你应该在你的实现文件中这样做。

【讨论】:

以上是关于在 Objective-C 中在哪里编写 @property 指令?的主要内容,如果未能解决你的问题,请参考以下文章

如何/在哪里声明用于编写objective-c代码的接口、实现、程序格式中的实例变量?

在 iPhone 的 Objective-C 中在 (commitEditingStyle) 之外调用 (deleteRowsAtIndexPaths)

在 Objective-C 中在矩形周长上投影一个点

Express.js 项目中在哪里进行验证——在数据库层进行验证(re. Mongoose)?

在 devkit pro 中在图像上显示文本时屏幕顶部出现垃圾

TortoiseSVN 在 Windows 7 中在哪里保存密码缓存文件? [复制]