关于Objective-C中“属性”的一些混淆

时间:2011-11-15 08:21:07

标签: iphone objective-c ios cocoa

@interface TheViewController : UIViewController
{
    IBOutlet UITableView  *table;
}
@property (nonatomic,retain) IBOutlet UITableView  *table;

或者就像这样:

@interface TheViewController : UIViewController
{

}
@property (nonatomic,retain) IBOutlet UITableView  *table;

它和第二个一样好吗?

有什么区别?

推荐哪个?

4 个答案:

答案 0 :(得分:1)

  

它和第二个一样好吗?

一般来说,这两种语法是正确的。

  

有什么区别?

第二个也将为您声明ivar,但只能正确运行较新的Objective C运行时系统。

  

推荐哪个?

好问题......我认为它们非常等效,前提是您可以限制自己使用较新的ObjC运行时系统。有关未明确声明ivars的可能缺点的更多提示,请查看此S.O. post

答案 1 :(得分:1)

在Objective-C 2.0中,合成属性将根据需要自动创建相应的ivars。所以这两种语法都是正确的。This文章将为您明确说明..

答案 2 :(得分:1)

由于IBOutlet,即使在ObjC 2.0环境中,这两个也不完全相同。必须在酒店宣布。它们就像这样:

@interface TheViewController : UIViewController
{
    IBOutlet UITableView  *table;
}
@property (nonatomic,retain) UITableView  *table;

@interface TheViewController : UIViewController
{
}
@property (nonatomic,retain) IBOutlet UITableView  *table;

注意在属性定义中添加了IBOutlet。

答案 3 :(得分:0)

通常它们在Objective-C 2.0环境中是等效的,但是调试器例如,在变量视图中看不到生成的ivar作为此对象的成员,并且您将不得不通过使用gdb来请求值。使用访问器方法的命令行po命令(尽管不是短格式点表示法)。