我还是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并保留它。
思考?最佳编码实践建议?或者我在这里缺少一些信息?
答案 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