像这样子类化 NSDictionary:@implementation NSDictionary (weather)

subclassing NSDictionary like so: @implementation NSDictionary (weather)

我正在查看 Ray Wenderlich AFNetworking tutorial,我发现了一种我以前从未见过的 subclassing NSDictionary 的方法:

第一个:

@implementation NSDictionary (weather)

然后在另一个文件中:

@implementation NSDictionary (weather_package)

这似乎只是 "work" 在包含它的另一个文件中。最令人费解的是,在使用这些的 class 中定义的 NSDictionary 似乎与 "weather_package" 版本匹配,并且在该容器中与 "weather" 版本匹配。

有人可以告诉我这里发生的事情的名称吗?通过查看代码,我并不完全清楚这是如何工作的,特别是编译器如何决定在何处应用什么,因为除了将它们包含在 header.

之外,没有对这些文件进行明确引用。

感谢您的帮助。

这不是子classing。这是使用类别扩展 class。这用于将新功能引入现有的 classes 而无需子 classing 它们。

可以为任何 class 声明类别,即使您没有原始实现源代码(例如标准 Cocoa 或 Cocoa Touch classes)。您在类别中声明的任何方法都将可用于原始 class 的所有实例,以及原始 class 的任何子class。在运行时,类别添加的方法与原始class实现的方法没有区别class。

类别可以这样定义

@interface ClassName (CategoryName)

@end

@implementation ClassName (CategoryName)

@end

有关详细信息,请阅读 https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/CustomizingExistingClasses/CustomizingExistingClasses.html#//apple_ref/doc/uid/TP40011210-CH6-SW1

它不是子类化,它更多的是使用新方法扩展现有实现,即所谓的类别:

https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/CustomizingExistingClasses/CustomizingExistingClasses.html