括号在接口声明中做了什么

时间:2013-10-17 16:02:53

标签: objective-c interface

我偶然发现https://github.com/AlanQuatermain/aqtoolkit/blob/master/Extensions/NSObject%2BProperties.h

界面定义为:

@interface NSObject (AQProperties)

(AQProperties)部分有什么作用?

2 个答案:

答案 0 :(得分:1)

它们是categories - 扩展现有类而不对其进行子类化的好方法。

总而言之,您的NSObject (AQProperties)定义了NSObject,其中包含一些与AQProperties相关的额外方法。

与子类不同,您只能将方法添加到类别,而不是额外的数据成员。

答案 1 :(得分:1)

它被称为“类别”。通过将方法添加到命名类别,即使您没有源代码,也可以扩展现有类:

@interface NSString (MyFancyStuff)
- (NSString*) stringByCopyingStringAndReplacingDollarCharsWithEuros;
- (NSUInteger) lengthIgnoringWhitespace;
@end

然后您可以照常实施这些新方法

@implementation NSString (MyFancyStuff)
- (NSString*) stringByCopyingStringAndReplacingDollarCharsWithEuros
{
    ...
}

- (NSUInteger) lengthIgnoringWhitespace 
{
    ...
}
@end

这些新方法的行为与NSString的所有其他方法一样(前提是,您确实包含了头文件,您声明了该类别):

NSString* text = [NSString stringWithFormat: @"Hello, %@", param];
NSUInteger length = [text lengthIgnoringWhitespace];

...

除了作为扩展类的工具之外,类还没有,类别对于构造自己类的接口也很有用。例如:

FancyStuff.h

@interface FancyStuff 
// Public methods and properties are declared here
@end

FancyStuff + Protected.h

#import "FancyStuff.h"

@interface FancyStuff (Protected)
// Methods, which may be useful for classes, which derive from 
// FancyStuff, but should not be considered part of the public API
@end

FancyStuff.m

#import "FancyStuff+Protected.h"

@implementation FancyStuff
...
@end

@implementation FancyStuff (Protected)
...
@end