类别和实例变量

时间:2010-09-09 17:54:26

标签: objective-c cocoa

我正在尝试向NSMutableArray添加一个类别,以允许我将其用作2D数组(由1D数组支持,使用将x& y索引转换为平面索引的方法)。由于我不允许将实例变量添加到类别中,我应该如何跟踪计算数组索引所需的行数和列数?

这是界面:

@interface NSMutableArray (TK2DMutableArray)
- (id) initWithColumns:(int) columns rows:(int) rows;
- (id) objectAtColumn:(int) col row:(int) row;
- (void) putObject:(id) object atColumn:(int) x Row:(int) y;
@end

以下是实施:

@implementation TK2DMutableArray

- (id) initWithColumns:(int) x rows:(int) y {
    self = [self initWithCapacity:x * y];

    return self;
}

- (id) objectAtColumn:(int) col row:(int) row {
    return [self objectAtIndex:[self indexAtColumn:col row:row]];
}

- (void) putObject:(id) object atColumn:(int) x row:(int) y {
    [self replaceObjectAtIndex:[self indexAtColumn:x row:y] withObject:object];
}

- (int) indexAtColumn:(int) col row:(int) row {
    return (col + (row * rows));
}

@end

我最初将其编码为NSMutableArray的子类;我现在知道在类集群上读了一点就错了。问题出现在最后一种方法中 - 我应该如何处理rows?如果我是子类,它将是一个普通的旧ivar。

我完全希望被告知创建一个以NSMutableArray作为属性的新类,但我想看看是否有办法首先使用类别。

非常感谢。

2 个答案:

答案 0 :(得分:4)

在10.6及更高版本(我不确定iOS),您可以使用objc_setAssociatedObject将任意事物与对象相关联,请参阅this Apple doc。您可以使用此机制“添加”和ivar。

但我认为最好创建一个以NSMutableArray为属性的新类。这样,您可以在类型级别区分1d数组和2d数组,以便编译器可以发出警告。例如,您不想在二维数组上意外使用objectAtIndex:,对吧?

答案 1 :(得分:2)

如果你真的需要一个具有NSMutableArray 接口的类,你的二维数组操作可能应该是NSMutableArray的子类。由于这是一个类集群,因此您还必须实现NSArrayNSMutableArray的基本操作。这些是countobjectAtIndex:insertObject:atIndex:removeObjectAtIndex:addObject:removeLastObjectreplaceObjectAtIndex:withObject:以及任何{{init 1}} - 您需要的方法。然后,您可以自己实现存储,或者只是将它们转发到NSMutableArray实例变量。

但正如Yuji建议的那样,你可能会为你的2d阵列增加一个新课程。