2012-06-14 43 views
2

对于ObjC,我还很新。我注意到,这是非常标准的,到处创建Objective C实例变量/属性的多重声明

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

然后

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

----例如。我知道@property的自动代码生成+更清晰的定义是多么有用,这要归功于苹果公司的Declared Properties页面。然而,我不明白为什么人们做这两件事是标准的 - 宣布他们的属性,然后在{大括号}中再次拥有它们。

我的意思是,如果我有一个类,我想让一些变量具有自动获取/设置器,有些不需要,那么我会理解,我的常规变量具有{}块,然后只创建@ property/@synthesize语句只是我想要的附加功能的特定变量;但是为什么在你知道你想要所有的实例变量都有getter和setter的情况下,总是有两个标准呢?我想我会跳出来,因为我基本上看到它在100%的时间里被使用,当我觉得它真的没有必要时...只需声明@properties并将其留在那里。

想法?最佳编码实践建议?还是有一些我在这里失踪的信息?

+0

我从括号中排除了IBOutlet,作为组织我对班级真正拥有的思想的一种方式。但那只是我。 – nhahtdh

回答

4

什么你在早期版本的Objective-C中需要重新看到,但现在已经不再。

在NeXT使用的第一版Objective-C中,直到引入新的运行时(在Mac OS X上使用Objective-C 2.0),所有实例变量必须声明为@interface中类结构的一部分。原因是如果你创建了一个类的子类,编译器需要知道这个类的实例变量布局,这样就可以看到在什么偏移量下放置子类的实例变量。

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

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

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

因此,重申一下,您只需要在早期版本的Objective-C语言中声明实例变量和综合属性。你看到的是多余的,不应该被认为是“最佳做法”。

0

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

如果省略了伊娃,还是创建伊娃

我同时创建,让所有我的ivars都在一起,括号内刚的界面声明之后

@interface MyClass 
{ 
    int variable1; 
} 
@end 
+0

不真实。您可以直接访问实例变量,即使它是作为综合属性的结果创建的,并且不会在类中声明。 – 2012-06-14 13:25:56

+0

所以你可以!没有意识到这一点。 –