-1

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

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

@end

但是也

//in MyViewController.m
@interface MyViewController ()

@end

@implementation MyViewController

@end

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

谢谢!

4

2 回答 2

2

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

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

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

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

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

于 2014-04-11T21:26:17.860 回答
0

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

于 2014-04-11T21:29:17.233 回答