2

我对 ObjC 还是很陌生。我注意到创建你的所有地方都是非常标准的

@interface myObj : NSObject {
    id delegate;
    NSDictionary *dict;
}

进而

@property (nonatomic,retain) NSDictionary *dict;
@property (retain) id delegate;

- 例如。我知道 @property 的自动代码生成 + 更清晰的定义是多么有用,这要归功于 Apple 的Declared Properties页面。然而,我不明白的是,为什么人们同时做这两个标准是标准的——声明他们的属性,然后将它们再次放在{大括号}中。

我的意思是,如果我有一个类,其中我希望某些变量具有自动 getter/setter 而有些不具有,那么我会理解为我的常规变量设置 {} 块,然后只创建 @property/@synthesize 语句只是那些我想要添加功能的特定变量;但是,为什么在您知道希望所有实例变量都具有 getter 和 setter 的情况下始终同时拥有这两种方法是标准的呢?我想我要跳闸了,因为我基本上在 100% 的时间里看到它像这样使用,而我觉得它真的没有必要……只需声明 @properties 并保留它。

想法?最佳编码实践建议?还是我在这里遗漏了一些信息?

4

2 回答 2

4

您所看到的在早期版本的 Objective-C 中是必需的,但现在不再需要了。

在 NeXT 使用的 Objective-C 的第一个版本中,直到引入新的运行时(在 Mac OS X 上使用 Objective-C 2.0),所有实例变量都必须在其@interface. 原因是如果你对一个类进行子类化,编译器需要知道类的实例变量布局,以便它可以看到放置子类的实例变量的偏移量。

当引入属性时,综合属性必须由类结构中的实例变量“支持”。因此,您必须同时声明实例变量和属性。

以上所有都不再正确。较新的 Objective-C 在查找实例变量偏移的方式上不那么脆弱,这意味着一些变化:

  • 并非所有实例变量都需要在@interface. 它们现在可以在@implementation: 中定义,但由于可能发生冲突和其他问题而不能在类别中定义。
  • 可以根据属性定义推断和创建合成属性的实例变量。
  • 您可以以编程方式将实例变量添加到您在运行时创建的类(仅在您将类注册为系统可用之前)。

因此,重申一下,您只需要在旧版本的 Objective-C 语言中声明实例变量和综合属性。您所看到的内容是多余的,不应被视为“最佳实践”。

于 2012-06-14T13:23:41.183 回答
0

我倾向于将属性视为我的公共变量,而其他人则视为私有变量,但是当您说“真的没有必要”时,您是对的。

如果省略 ivar,仍会创建 ivar

我创建了两者,以便我所有的 ivars 都在一起,并且在接口声明之后的大括号内

@interface MyClass
{
    int variable1;
}
@end
于 2012-06-14T13:21:56.707 回答