Xcode为NSViewController生成多个@interface声明?

时间:2014-04-11 21:18:37

标签: objective-c xcode cocoa generated-code

我正在制作一个Cocoa应用程序,并使用Xcode进行各种代码生成。适用于为子类化UIView生成.h和.m文件,但是当我将UIViewController子类化时,我在两个文件中都获得了相同的@interface声明,除了在.m文件中它最后有( )

//in MyViewController.h
@interface MyViewController : NSViewController <MyViewDelegate>

@end

但也

//in MyViewController.m
@interface MyViewController ()

@end

@implementation MyViewController

@end

然而它汇编得很好。因此,假设这是正常行为,问题的两个部分是: (A)为什么会发生这种情况,并且 (B)结果是什么 - 特别是在编译顺序方面?

谢谢!

2 个答案:

答案 0 :(得分:2)

  

当我继承UIViewController时,我在两个文件中都得到一个相同的@interface声明,除了在.m文件中它有()

正如您所注意到的,两个接口块相同 - ()很重要。 ()的一个是类扩展名,类似于没有名称的类别。类别和类扩展之间的两个重要区别是:

  1. 您可以在类扩展中声明实例变量,但不能在类别中声明。

  2. 类扩展必须出现在与实现块相同的文件中。

  3. 类扩展对于声明您不希望在头文件中公开的实例变量和方法很有用,例如特定于实现的方法或变量,并且不应该被类的用户所依赖。

答案 1 :(得分:0)

您熟悉分类吗?你所观察到的是类似的,但与类别有重要的区别。这里的区别在于它是匿名的(因此是空的parens)并且在编译原始类的同时编译。后面的部分是一个重要部分:它意味着您可以添加实例属性(存储)。这最常用于声明&#34;仅内部&#34;或者&#34;私人&#34;方法和属性。但请记住,在运行时,没有“私人”的概念。执行,它是关于您发布的哪个界面与未发布的界面。这只是一种具有非常清晰定义的界面的方法,该界面仅仅是已发布的#39;对于编写核心类实现文件的人。