控制最佳实践

时间:2011-08-20 18:54:55

标签: objective-c properties

仅使用目标c / xcode中的属性为控件或实例变量创建实例变量是否更好?

如果要创建属性,最好将其设置为原子或非原子(对于控件)。

例如,执行以下操作的最佳做​​法是什么:

@interface blah
{
  UILabel *label;
}

@property (nonatomic, retain) IBOutlet UILabel *label;

OR

@interface blah
{
  IBOutlet UILabel *label;
}

OR

@interface blah
{    
  UILabel *label;
}

@property (retain) IBOutlet UILabel *label;

然后当我dealloc最好的时候:

[self.label release]

或     [标签发布]

编辑:

总结一下......

  1. 在代码中引用控件时,应使用实例变量
  2. 在dealloc中,您可以通过[iVal release] \
  3. 释放控件

3 个答案:

答案 0 :(得分:1)

我不会为标签创建属性,因为它不需要在UIViewController之外访问,因此我会使用第二种情况。关于原子性的事情 - 逻辑规定,由于UI应该只从主线程更新,UILabel也应该只在主线程中访问。因此,如果您声明属性nonatomicatomic几乎无关紧要,您只能从主线程访问和更改UILabel var。

性能方面,nonatomic属性也更快,因为访问不需要获取锁定。

答案 1 :(得分:1)

如果您正在使用界面构建器,则声明

IBOutlet UILabel *label;

警告IB,有一个可以链接的标签。这允许您使用指针label修改您在IB中创建的标签。但是,如果标签永远不需要修改,则根本不需要声明它或引用它。只需在IB中创建它并保留它。在这种情况下,不需要getter或setter方法,因此根本不需要使用@property@synthesize

如果您是以编程方式完全创建和配置标签,则无需将其声明为IBOutlet。只需使用

UILabel *label;

然后在代码中根据需要调整label。国际文凭组织不需要知道它存在。然后在需要时创建getter和setter方法。

答案 2 :(得分:1)

您希望避免在dealloc方法中使用方法调用。您可能遇到一个条件,即getter访问另一个可能已经发布的实例变量。只释放实例变量更安全。

[label release];

如果您决定通过访问者发布,请使用以下内容(如fichek所述):

self.label = nil;