Objective c 由Xcode为NSViewController生成的多个@interface声明?
我正在制作一个Cocoa应用程序,并使用Xcode生成各种代码。生成.h和.m文件以子类化UIView很好,但当我将UIViewController子类化时,两个文件中的@interface声明都是相同的,除了.m文件末尾的声明:Objective c 由Xcode为NSViewController生成的多个@interface声明?,objective-c,xcode,cocoa,generated-code,Objective C,Xcode,Cocoa,Generated Code,我正在制作一个Cocoa应用程序,并使用Xcode生成各种代码。生成.h和.m文件以子类化UIView很好,但当我将UIViewController子类化时,两个文件中的@interface声明都是相同的,除了.m文件末尾的声明: //in MyViewController.h @interface MyViewController : NSViewController <MyViewDelegate> @end 但它编译得很好。假设这是正常行为,问题的两部分是: A为什么会发生
//in MyViewController.h
@interface MyViewController : NSViewController <MyViewDelegate>
@end
但它编译得很好。假设这是正常行为,问题的两部分是:
A为什么会发生这种情况,以及
B结果是什么?特别是在编译顺序方面
谢谢
当我将UIViewController子类化时,我在这两个文件中得到一个完全相同的@interface声明,除了它在.m文件中的声明
正如您所注意到的,这两个接口块并不完全相同,这一点很重要。带有的是类扩展,类似于没有名称的类别。类别和类扩展之间的两个重要区别是:
可以在类扩展中声明实例变量,但不能在类别中声明
类扩展名必须与实现块出现在同一文件中
类扩展对于声明不希望在头文件中公开的实例变量和方法非常有用,例如特定于实现且类用户不应依赖的方法或变量。您熟悉类别吗?你所观察到的是相似的,但与类别有重要区别。这里的区别是,它是匿名的,因此在编译原始类的同时编译空paren。后面的部分是一个重要的部分:它意味着您可以在存储中添加实例属性。这通常用于声明仅内部或私有方法和属性。但请记住,在运行时并没有“私有”强制的概念,而是关于您已发布与未发布的接口。这只是一种非常清晰定义接口的方法,该接口仅“发布”给编写核心类实现文件的人员。查找类扩展以解释表单。类扩展不必与实现块出现在同一文件中。您可以在单独的头文件中声明它,甚至可以从其他类中包含和使用它。
//in MyViewController.m
@interface MyViewController ()
@end
@implementation MyViewController
@end