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

时间:2012-06-14 13:10:50

标签: objective-c automatic-properties

我还是ObjC的新手。我注意到,创建你的

在任何地方都非常标准
@interface myObj : NSObject {
    id delegate;
    NSDictionary *dict;
}

然后

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

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

我的意思是,如果我有一个课程,我希望某些变量有自动getter / setter而有些不能,那么我会理解为我的常规变量有{}块然后只创建@ property / @只为那些我想要增加功能的特定变量合成语句;但是为什么在你知道你希望你的所有实例变量都拥有getter和setter的情况下总是同时拥有它们?我想我正在绊倒,因为我基本上看到它在100%的时间内使用这种情况,当我觉得它确实没有必要时...只需声明@properties并保留它。

思考?最佳编码实践建议?或者我在这里缺少一些信息?

2 个答案:

答案 0 :(得分:4)

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

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

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

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

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

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

答案 1 :(得分:0)

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

如果省略ivar,仍会创建一个ivar

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

@interface MyClass
{
    int variable1;
}
@end