在.m文件中,空的@interface声明有什么用途?

46

我开始了一个新的iOS 5项目,注意到每个.m文件顶部有一些新的东西

#import "HomeViewController.h"

@interface HomeViewController ()

@end

@implementation HomeViewController
@synthesize ...
  • 如果我有一个单独的.h文件,那么这个额外的@interface ... 是否是必需的?
  • 为什么这在iOS 5之前的项目中没有显示出来?
  • 我能否使用这个替代单独的.h文件?
  • 这方面的最佳实践是什么?

可能是在.h和.m文件中@interface定义之间的区别的重复问题。 - jscs
2个回答

78
这是一个类扩展。您可以使用它来声明那些不想出现在.h文件中的内容。
许多开发人员甚至在此之前就手动将扩展添加到.m文件中。因此,我想苹果公司将其包含在模板中是因为它被广泛使用并被认为是一种良好的实践。
实际上,.h文件只应用于声明将从其他文件中使用的内容。您可能需要声明一些仅在.m文件中使用的属性、方法或常量。对于这些声明,最好在类扩展中进行。
因此,回答您的问题:
  • 如果我有单独的.h文件,是否需要这个额外的@interface ...?
不需要,但这是最佳实践。
  • 为什么这在iOS 5之前的项目中没有显示?
即使这是一种常用的做法,也没有包含在模板中。
  • 我可以使用这个代替单独的.h文件吗?

不行。类扩展并不能取代你必须在.h文件中声明类的“公共”接口。

  • 今后最佳做法是什么?

你应该将所有不需要在.m文件之外可见的声明放在类扩展中。


谢谢你提供如此详细的答案!很高兴看到苹果在新模板中包含了它,因为这是大多数开发人员正在实现的最佳实践! - Toran Billups

11
在实现文件中的接口部分允许您声明变量、属性和方法,这些内容是私有的,意味着其他类看不到它们。
不,这并不是必需的。但我尽可能多地使用它,并且只公开那些其他类需要看到的内容。

2
在Objective-C中,私有(Private)指的是编译器无法从类外部访问变量、属性和方法,但由于任何人都可以调用任何东西,所以方法并不真正私有。 - Paul.s

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接