我对 ObjC 还很陌生。我注意到创建您的内容在任何地方都是相当标准的
@interface myObj : NSObject {
id delegate;
NSDictionary *dict;
}
然后
@property (nonatomic,retain) NSDictionary *dict;
@property (retain) id delegate;
——例如。我知道自动代码生成+ @property 的更清晰定义有多么有用,这要归功于 Declared Properties翻过Apple。然而,我不明白的是,为什么人们会同时执行这两种操作——声明其属性,然后再次将它们放在{大括号}中。
我的意思是,如果我有一个类,我希望某些变量具有自动 getter / setter ,而另一些则不具有,那么我会理解为我的常规变量使用 {} block ,然后只创建 @property/@仅针对那些我想要添加功能的特定变量合成语句;但是,当您知道希望所有实例变量都具有 getter 和 setter 的情况下,为什么总是同时拥有这两种方法是标准的呢?我想我会被绊倒,因为我基本上 100% 地看到它都是这样使用的,而我觉得它确实没有必要......只需声明 @properties 并保留它即可。
想法?最佳编码实践建议?或者我在这里遗漏了一些信息?
最佳答案
您所看到的内容在 Objective-C 的早期版本中是必需的,但现在不再需要了。
在 NeXT 使用的 Objective-C 的第一个版本中,直到引入新的运行时(Mac OS X 上的 Objective-C 2.0),所有实例变量都必须在其中声明为类结构的一部分>@接口(interface)
。原因是,如果您对一个类进行子类化,编译器需要知道该类的实例变量布局,以便它可以看到放置子类实例变量的偏移量。
引入属性后,合成属性必须由类结构中的实例变量“支持”。因此,您必须声明实例变量和属性。
以上所有内容都不再正确。较新的 Objective-C 在查找实例变量偏移量方面不那么脆弱,这意味着一些变化:
- 并非所有实例变量都需要位于
@interface
中。现在可以在@implementation
中定义它们:尽管由于可能发生冲突和其他问题而不能在类别中定义。 - 可以根据属性定义推断和创建合成属性的实例变量。
- 您可以通过编程方式将实例变量添加到您在运行时创建的类中(仅在您将类注册为系统可用之前)。
因此,重申一下,您只需要在旧版本的 Objective-C 语言中声明实例变量和合成属性。您所看到的内容是多余的,不应被视为“最佳实践”。
关于Objective-C 实例变量/属性的多重声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11033775/