在实现文件中声明属性是一个好习惯,如果是,有什么用?

时间:2011-09-08 06:52:49

标签: ios

以下代码是Objective-C中的一个很好的编程实践吗?

  #import "Custom.h"

  @interface Custom () 
  @property (nonatomic, retain) UILabel *label;
  @end

  @implementation Custom
  @synthesize label;

  - (void) dealloc {
      [label release];
      [super dealloc];
  }

  @end

3 个答案:

答案 0 :(得分:18)

这背后的想法是,您在头文件中声明的所有属性对于该类之外的所有人都是可见的和可访问的。 要尊重OOP的封装原则,您希望将类的某些成员的范围尽可能保密。因此,只有你的班级才会使用的所有成员都应该隐藏在“外部世界”中。这可以通过声明一个名为“extension”的特殊类型(它不能有一个名称,它声明为@interface Class()),以及该扩展中的属性(以及私有方法声明,如果你想要的话)来完成孔)

关于这是一个好的做法的问题,可以在不同的开发者之间讨论。对我来说,这是因为它是一个很好的OOP练习,也因为它有助于保持你的头文件尽可能干净(所以让其他开发人员更容易看到你的班级提供的“服务”)

答案 1 :(得分:4)

我喜欢这样做来创建私有接口。如果属性仅用于您的实现,而不是与其他对象协作,则不应污染标头(定义 public 接口)。您还可以通过以下方式隐藏私有协议实现:

@interface YourClass () <UIAlertViewDelegate>

通过这种方式,您班级的用户无需知道您的实施中某处隐藏了UIAlertView

可能被视为缺点的是您的子类无法再访问“私有”属性。您必须将其声明移动到头文件(将其公开),或创建一个特殊的“受保护”标头。

在此上下文中值得一提的另一个选择是在@implementation指令中声明私有变量:

@implementation YourClass {
    NSString *foo;
    NSUInteger bar;
}

这些不是静态的,它们是常规实例变量。

答案 2 :(得分:0)

您可能希望在标题中定义label,以便以后使用@implementations中的其他方法。例如,在viewDidLoad中创建该标签,您可以在其他方法中更改它。