我正在制作一个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)结果是什么 - 特别是在编译顺序方面?
谢谢!
答案 0 :(得分:2)
当我继承UIViewController时,我在两个文件中都得到一个相同的@interface声明,除了在.m文件中它有()
正如您所注意到的,两个接口块不相同 - ()
很重要。 ()
的一个是类扩展名,类似于没有名称的类别。类别和类扩展之间的两个重要区别是:
您可以在类扩展中声明实例变量,但不能在类别中声明。
类扩展必须出现在与实现块相同的文件中。
类扩展对于声明您不希望在头文件中公开的实例变量和方法很有用,例如特定于实现的方法或变量,并且不应该被类的用户所依赖。
答案 1 :(得分:0)
您熟悉分类吗?你所观察到的是类似的,但与类别有重要的区别。这里的区别在于它是匿名的(因此是空的parens)并且在编译原始类的同时编译。后面的部分是一个重要部分:它意味着您可以添加实例属性(存储)。这最常用于声明&#34;仅内部&#34;或者&#34;私人&#34;方法和属性。但请记住,在运行时,没有“私人”的概念。执行,它是关于您发布的哪个界面与未发布的界面。这只是一种具有非常清晰定义的界面的方法,该界面仅仅是已发布的#39;对于编写核心类实现文件的人。