为什么@interface上面有@interface?

时间:2012-07-21 17:32:54

标签: objective-c ios xcode ios5 xcode4.4

我想知道为什么有两次@interface。一个位于class.h,另一个位于class.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 个答案:

答案 0 :(得分:51)

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

@interface MyClass ()

这个特别重要,因为您可以使用它来向您的班级添加其他实例变量。

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

@interface MyClass (CategoryName)

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

答案 1 :(得分:3)

第二个&#34;界面&#34;定义&#34; TestTableViewController&#34;的扩展名。 class,只对那些只导入h文件的人不可见。这是在目标C中创建私有方法的事实上的方法。

答案 2 :(得分:2)

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

答案 3 :(得分:2)

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

普通类别界面如下所示:

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

相应的实施:

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

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

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