Objective-C中的分类用法

6

我看到一些我继承的代码,它看起来像下面这样:

@interface SomeClass (private)

这是在SomeClass.m文件中,即实现文件中。有一个相应的头文件,但头文件并没有表明该类使用了分类。在这种情况下,(private)只是给SomeClass类的某个分类取的不好的名称吗?我假设在实现中指定这样的分类是完全合法的?

3个回答

30

“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

这里是一个关于“分类和扩展”的苹果文档链接


我不同意你应该将私有(类别)方法与常规实现混合使用。这是一种风格问题,但我喜欢保持清晰的分离。 - Marc Charbonneau
值得注意的是,类扩展(即您所称的类继承)是Leopard中的新功能。 - Peter Hosey
@Peter。感谢您指出这一点。 @Marc。在类别为空的情况下,方法必须在主块中实现。但是,当使用第二种方法时,我同意将类别实现放在它们自己的块中会更好。 - Abizern
这对我非常有帮助。在Xcode中,您建议将类别文件放在Models文件夹还是Supporting Files文件夹中? - JohnMerlino
@JohnMerlino 如果它们是扩展系统类,我会将它们放在一个名为“Categories”的组中。在极少数情况下,如果我创建了自己类的分类,我会将它们保留在与其所属类相同的位置。 - Abizern

2
“Private”只是一个名称,它暗示这些方法不是公共的,而是用于类的内部实现,但在分类的声明中没有任何强制执行的内容。
此外,定义在分类中的方法是在运行时添加到类定义中的,因此相应的头文件不需要声明它正在使用一个分类--它会自动“使用”。

2

我使用这个来声明(并因此记录下来,并且让编译器不再报错)不需要在公共接口中的辅助方法。然后,类的“消费者”(默认情况下,除非有好的礼貌原则,否则没有任何限制)被限制只能使用头文件中定义的方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接