Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 由Xcode为NSViewController生成的多个@interface声明?_Objective C_Xcode_Cocoa_Generated Code - Fatal编程技术网

Objective c 由Xcode为NSViewController生成的多个@interface声明?

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为什么会发生

我正在制作一个Cocoa应用程序,并使用Xcode生成各种代码。生成.h和.m文件以子类化UIView很好,但当我将UIViewController子类化时,两个文件中的@interface声明都是相同的,除了.m文件末尾的声明:

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

@end
但它编译得很好。假设这是正常行为,问题的两部分是: A为什么会发生这种情况,以及 B结果是什么?特别是在编译顺序方面

谢谢

当我将UIViewController子类化时,我在这两个文件中得到一个完全相同的@interface声明,除了它在.m文件中的声明

正如您所注意到的,这两个接口块并不完全相同,这一点很重要。带有的是类扩展,类似于没有名称的类别。类别和类扩展之间的两个重要区别是:

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

类扩展名必须与实现块出现在同一文件中


类扩展对于声明不希望在头文件中公开的实例变量和方法非常有用,例如特定于实现且类用户不应依赖的方法或变量。

您熟悉类别吗?你所观察到的是相似的,但与类别有重要区别。这里的区别是,它是匿名的,因此在编译原始类的同时编译空paren。后面的部分是一个重要的部分:它意味着您可以在存储中添加实例属性。这通常用于声明仅内部或私有方法和属性。但请记住,在运行时并没有“私有”强制的概念,而是关于您已发布与未发布的接口。这只是一种非常清晰定义接口的方法,该接口仅“发布”给编写核心类实现文件的人员。

查找类扩展以解释表单。类扩展不必与实现块出现在同一文件中。您可以在单独的头文件中声明它,甚至可以从其他类中包含和使用它。
//in MyViewController.m
@interface MyViewController ()

@end

@implementation MyViewController

@end