我看到一些我继承的代码,它看起来像下面这样:
@interface SomeClass (private)
这是在SomeClass.m
文件中,即实现文件中。有一个相应的头文件,但头文件并没有表明该类使用了分类。在这种情况下,(private)
只是给SomeClass
类的某个分类取的不好的名称吗?我假设在实现中指定这样的分类是完全合法的?
我看到一些我继承的代码,它看起来像下面这样:
@interface SomeClass (private)
这是在SomeClass.m
文件中,即实现文件中。有一个相应的头文件,但头文件并没有表明该类使用了分类。在这种情况下,(private)
只是给SomeClass
类的某个分类取的不好的名称吗?我假设在实现中指定这样的分类是完全合法的?
“private”并不是让方法变为私有的原因;方法之所以是私有的,是因为它们在实现文件中声明的类别中。
有三种使用类别的方式,每种方式都可向类中添加方法(注意:只有方法,没有实例变量)
扩展现有Cocoa类
这允许您向现有类中添加自己的方法。 例如,如果您想要扩展NSString以应用特殊的大写形式,则可以创建一个名为NSString+Capitals的新类。在NSString+Capitals.h中,您将拥有:
@interface NSString (Capitals)
-(NSString *)alternateCaps:(NSString *)aString;
@end
在NSString+Capitals.m中,您需要实现该方法。
@implementation NSString (Capitals)
-(NSString *)alternateCaps:(NSString *)aString
{
// Implementation
}
类的私有方法
这与上面相同,只是额外的方法在实现文件(.m)中声明和定义。通常这是一种拥有私有方法的方式 - 因为它们不在 .h 文件中(这是其他类 #import 的文件),因此它们根本不可见。在这种情况下,方法的实现是在它们自己的实现块中完成的。例如:
// someClass.m
@interface someClass (extension)
-(void)extend;
@end
@implementation someClass
// all the methods declared in the .h file and any superclass
// overrides in this block
@end
@implementation someClass (extension)
-(void)extend {
// implement private method here;
}
类别扩展(10.5 Leopard中的新功能)
一种更简单的实现私有方法的方式。在这种特殊情况下,类别名称为空,私有方法与所有其他类方法在同一个代码块中实现。
// someClass.m
@interface someClass ()
-(void)extend;
@end
@implementation someClass
// all the methods declared in the .h file and any superclass
// overrides in this block
// Implement private methods in this block as well.
-(void)extend {
// implement private method here;
}
@end
这里是一个关于“分类和扩展”的苹果文档链接。
我使用这个来声明(并因此记录下来,并且让编译器不再报错)不需要在公共接口中的辅助方法。然后,类的“消费者”(默认情况下,除非有好的礼貌原则,否则没有任何限制)被限制只能使用头文件中定义的方法。