关于C#:为什么@interface上面有@interface?

Why is there @interface above @implementation?

我想知道为什么会有两个@interface。一个在class.h中,另一个在class.m中。例如:

TestTableViewController.h

1
2
3
4
5
#import <UIKit/UIKit.h>

@interface TestTableViewController : UITableViewController

@end

和(自动生成的)class.m我发现:

1
2
3
4
5
6
7
8
9
10
11
#import"TestTableViewController.h"

@interface TestTableViewController ()

@end

@implementation TestTableViewController

... methods delegated from UITable delegates

@end

所以我的问题是,.m文件中的@interface TestTableViewController ()是关于什么的。为什么会这样?我需要它吗?

提前谢谢


第二个@interface指令在实现文件(.m)中,您可以从中推断它是用来声明类的创建者不希望向类的用户公开的内容。这通常意味着私有和/或内部方法和属性。还要注意有两种类型的操作。其中一个(您在这里看到)被称为"类扩展",它由一对空括号表示:

1
@interface MyClass ()

这一个非常重要,因为您可以使用它向类中添加额外的实例变量。

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

1
@interface MyClass (CategoryName)

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


第二个"接口"定义了"testtableviewcontroller"类的扩展名,只有导入h文件的人才能看到它。这是在目标C中创建私有方法的事实方法。


TestTableViewController.h文件中的接口是类扩展名的声明。有两个圆括号显示这一点。语法与为类编写类别的语法相同。但在本例中,它用于声明一些作者不希望在头文件中公开的私有方法。

普通类别界面如下:

1
2
3
@interface TestTableViewController (Your_Category_Name)
- (void)doSomething;
@end

以及相应的实施:

1
2
3
4
5
@implementation TestTableViewController (Your_Category_Name)
-(void)doSomething {
// Does something...
}
@end

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

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


在这里,您可以声明只想在类中使用的私有方法和属性,但不能公开给其他类。