38

我想知道为什么有两次@interface。一进一class.hclass.m。例如:

TestTableViewController.h

#import <UIKit/UIKit.h>

@interface TestTableViewController : UITableViewController

@end

并且(自动生成)class.m我发现:

#import "TestTableViewController.h"

@interface TestTableViewController ()

@end

@implementation TestTableViewController

... methods delegated from UITable delegates

@end

所以我的问题是,文件中的内容是关于什么@interface TestTableViewController ().m。为什么它在那里?我需要吗?

提前致谢

4

4 回答 4

56

第二个@interface指令在实现文件 (.m) 中——你可以从中推断出它是用来声明类的创建者不想暴露给类的用户的东西。这通常意味着私有和/或内部方法和属性。另请注意,这样做有两种类型。一个(您在此处看到)称为“类扩展”,它由一对空括号表示:

@interface MyClass ()

这一点特别重要,因为您可以使用它向您的类添加额外的实例变量。

第二个,称为“类别”,由一对非空括号表示,包含类别的名称,如下所示:

@interface MyClass (CategoryName)

它也用于扩展类。您不能使用类别将实例变量添加到一个类中,但您可以为同一个类有多个类别,这就是它主要用于扩展您没有源代码的系统/框架类的原因——所以从这个意义上说,类别与类扩展完全相反。

于 2012-07-21T17:45:33.187 回答
3

第二个“接口”定义了“TestTableViewController”类的扩展,对于只导入 h 文件的人是不可见的。这是在目标 C 中创建私有方法的事实上的方式。

于 2012-07-21T17:39:57.923 回答
2

在那里你可以声明你只想在你的类中使用的私有方法和属性,而不是暴露给其他类。

于 2012-07-21T17:35:11.400 回答
2

文件中的接口TestTableViewController.h是类扩展的声明。有 2 个圆括号显示了这一点。语法与为类编写类别相同。但在这种情况下,它用于声明作者不想在头文件中公开的某种私有方法

一个普通的分类界面是这样的:

@interface TestTableViewController (Your_Category_Name)
- (void)doSomething;
@end

以及相应的实现:

@implementation TestTableViewController (Your_Category_Name)
-(void)doSomething {
// Does something...
}
@end

在您的示例中,没有指定类别名称,因此它只是扩展了类,您可以在正常实现中实现该方法。

通常这种技术用于“隐藏”方法。它们没有在头文件中声明,如果您只导入 .h 文件,它们是不可见的。

于 2012-07-21T17:41:43.967 回答