我正在制作可可应用,并使用Xcode进行各种代码。适用于为子类化UIView生成的。

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

@end
.

,但也

//in MyViewController.m
@interface MyViewController ()

@end

@implementation MyViewController

@end
.

但它编译得很好。因此,假设这是正常行为,问题的两部分是: (a)为什么这发生了,而且 (b)结果是什么 - 特别是在编译顺序方面?

谢谢!

有帮助吗?

解决方案

当我子类UIViewController时,我在两个文件中获得一个@Interface声明,除了它具有()

中的.m文件

如您所知,两个接口块是不是相同 - ()很重要。具有()的那个是类扩展,它类似于没有名称的类别。类别和类扩展之间的两个重要差异为:

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

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

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

其他提示

你熟悉类别吗?你在观察的是类似的,但是来自类别的重要区别。这里的区别是它是匿名(因此空的Parens)并同时编译原始类被编译。后来的一部分是一个重要的部分:这意味着您可以添加实例属性(存储)。这是最常用的,用于声明“仅限”或“私有”方法和属性。但请记住,在运行时,没有“私人”执法的概念,这是您发布了什么界面的所有界面。这只是一个非常明确定义的界面的一种方法,该界面只会“发布”核心类的实现文件的人。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top