Objective-C中的类别用法

时间:2008-12-11 21:17:31

标签: objective-c

我看到一些我继承的代码如下所示:

@interface SomeClass (private)

这是在实施文件SomeClass.m内。有一个附带的头文件,不建议该类使用类别。在这种情况下,(private)只是给SomeClass的类别一个不好的名字吗?我假设在实现中指定类似这些类别是完全合法的吗?

3 个答案:

答案 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)

我用它来给我一个声明(因此文档,以及关闭编译器)辅助方法的地方,这些方法不需要在公共接口中。然后,除了使用头文件中定义的方法之外,该类的“消费者”(默认,除了良好的举止之外没有什么能阻止它们)。