Objective-C 实例变量/属性的多重声明

标签 objective-c automatic-properties

我对 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/

相关文章:

objective-c - 为什么图像不显示在 UIScrollView 中?

ios - 忽略以标签或提及开头的单词

c# - 使用对象初始值设定项设置私有(private) setter

c# - 返回接口(interface)的自动属性

ios - 更改动态单选按钮中的图像

ios - iOS 中 JSON 解析中的 TableView 中未显示图像

objective-c - 将毫秒转换为 NSDate

c# - 表达式主体属性与 {get;放;}

c# - 在 C# 中,我可以让自动属性在属性的帮助下执行一些额外的工作吗?

c# - 使用自动属性实现单例是个好主意吗?