我看到一些我继承的代码如下所示:
@interface SomeClass (private)
这是在实施文件SomeClass.m
内。有一个附带的头文件,不建议该类使用类别。在这种情况下,(private)
只是给SomeClass
的类别一个不好的名字吗?我假设在实现中指定类似这些类别是完全合法的吗?
答案 0 :(得分:31)
私有名称不是“私人”;这些方法是私有的,因为它们属于在实现文件中声明的类别。
一个类别有三种用法,每种用法都为类添加方法(注意:仅限方法,而不是iVars)
扩展现有的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文件中(这是#由其他类导入)它们根本不可见。在这种情况下,方法的实现在它们自己的实现块中完成。 e.g
// 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
以下是有关类别和扩展程序的Apple文档的link。
答案 1 :(得分:2)
“私有”只是一个名称,表明这些方法不公开,并且用于类的内部实现,但是在类别的声明中没有任何内容强制执行该方法。
此外,类别中定义的方法会在运行时添加到类定义中,因此附带的头文件无需声明它正在使用类别 - 它会自动“使用”。
答案 2 :(得分:2)
我用它来给我一个声明(因此文档,以及关闭编译器)辅助方法的地方,这些方法不需要在公共接口中。然后,除了使用头文件中定义的方法之外,该类的“消费者”(默认,除了良好的举止之外没有什么能阻止它们)。