1

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

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

4

2 回答 2

5

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

@interface RKTableViewController (TableView)
@end

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

于 2012-06-05T15:44:02.850 回答
4

这些是类别。有时非常有帮助。

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

类别添加的方法成为类类型的一部分。例如,添加到类别中的 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];
于 2012-06-05T15:43:24.467 回答