带有“+”的班级名称

时间:2012-06-05 15:40:36

标签: objective-c xcode

我正在使用Xcode中的iOS项目,我看到一些名称带有“+”的类;例如: TableViewController+TableView.h然后该类名为:@interface RKTableViewController (TableView),而不是RKTableViewController+TableView

这是+(TableView)是什么?如果它的子类UITableView不应该将该类声明为:Subclassed name : Parent class name format?

2 个答案:

答案 0 :(得分:5)

文件名中的+在语义上并不重要。命名文件“ClassName + CategoryName.h / m”只是命名包含类别的文件的常用约定。

@interface RKTableViewController (TableView)
@end

RKTableViewController类上声明一个名为“TableView”的类别。类别用于向主要实现之外的类添加方法。请在此处查看有关类别的Apple文档:http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/objectivec/chapters/occategories.html

答案 1 :(得分:4)

这些是类别。这些都非常有用。

  

您可以通过在接口文件中声明方法来向类添加方法   在类别名称下并在实现文件中定义它们   同名的。类别名称表示方法是   添加到其他地方声明的类,而不是新类。你不能,   但是,使用类别向a添加其他实例变量   类。

     

类别添加的方法成为类类型的一部分。对于   例如,包括添加到类别中的NSArray类的方法   作为编译器期望NSArray实例具有的方法   剧目。但是,在子类中添加到NSArray类的方法   不包含在NSArray类型中。 (这只适用于   静态类型对象因为静态类型是唯一的方法   编译器可以知道对象的类。)

     

类别方法可以执行类中定义的方法   适当的可以做。在运行时,没有区别。方法了   类添加到类中的所有类都继承   子类,就像其他方法一样。

http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/objectivec/chapters/occategories.html

示例:

以下是我一直使用的类别的示例。我不拥有NSMutableArray,但我希望有一个简单的移动功能。而不是仅仅为了添加一个简单的函数而进行子类化,我附上了一个类别。

// NSMutableArray+Move.h

@interface NSMutableArray (move)

- (void)moveObjectFromIndex:(NSUInteger)from toIndex:(NSUInteger)to;

@end

// NSMutableArray+Move.m

@implementation NSMutableArray (move)

- (void)moveObjectFromIndex:(NSUInteger)from toIndex:(NSUInteger)to
{
    if (to != from) {
        id obj = [self objectAtIndex:from];
        [self removeObjectAtIndex:from];
        if (to >= [self count]) {
            [self addObject:obj];
        } else {
            [self insertObject:obj atIndex:to];
        }
    }
}

这允许我使用已经在我的应用程序中创建的类来做新事物。因此,无论我在哪里使用NSMutableArray,我都可以像我这样调用我添加的方法

NSMutableArray *myArray = [NSMutableArray arrayWithObjects:@"Object A", @"Object B", @"Object C", nil];

[myArray moveObjectFromIndex:0 toIndex:2];