我想知道为什么有两次@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
是什么。为什么会这样?我需要吗?
提前致谢
答案 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文件,则不可见。