1

通常我这样对待 Objective-c 中的实例变量:

@interface MyClass : NSObject
@property (nonatomic, retain) NSMutableArray *mutableArray;
@end

@implementation MyClass
@synthesize mutableArray;

- (id) init {
    if((self = [super init])) {
        self.mutableArray = [NSMutableArray array];
    }
    return self;
}

- (void) dealloc {
    [mutableArray release];
    [super dealloc];
}

@end

我对上面的语法感觉很舒服。但是,对于 2D 数组实例变量(如NSUInteger 2dArray[10][10].

在接口声明、合成 getter/setter 和内存管理方面,二维数组实例变量的适当 Objective-c 语法是什么?

4

4 回答 4

3

这不是Objective C 语法。它是纯 C 语法。你不需要专门说你想要一个 objc 对象的二维数组。只需声明/定义可变数组并向其中添加其他数组。

于 2012-04-25T15:19:14.597 回答
3

你不需要你的数组分配内存;在类中定义它们非常好,并且它们将始终以相同的大小存在。因此,您无需担心内存管理,您的 getter/setter 应该手动定义,具体取决于您想要做什么。例如,这些 getter/setter 方法允许获取/设置单个值:

@interface MyClass : NSObject
{
    NSUInteger _twoDeeArray[10][10];
}

- (void)setTwoDeeArrayX:(NSUInteger)x y:(NSUInteger)y value:(NSUInteger)value;
- (NSUInteger)twoDeeArrayX:(NSUInteger)x y:(NSUInteger)y;

@end

@implementation MyClass

- (void)setTwoDeeArrayX:(NSUInteger)x y:(NSUInteger)y value:(NSUInteger)value
{
    _twoDeeArray[x][y] = value;
}

- (NSUInteger)twoDeeArrayX:(NSUInteger)x y:(NSUInteger)y
{
    return _twoDeeArray[x][y];
}

@end

您可能应该对 x 和 y 进行范围检查,但您明白了。

于 2012-04-25T15:25:09.003 回答
1

对于二维数组,您可以:

  1. 使用 C 数组(就像你在帖子中提到的那样)
  2. 将 NSMutableArray 添加到 NSMutableArray
  3. 创建一个类来实现您的二维数组版本

如果您只想在数组中使用原始类型,那么这三个都很好。

对于 Objective-C 对象,您也可以使用带有id类型的 C 数组,但您必须自己管理内存分配/释放。2 和 3 是更好的方法。

供参考:

于 2012-04-25T15:27:54.370 回答
0

在 iOS 6 中,您可以使用下标来定义使用方括号语法的矩阵类,matrix[row][col]您可以在其中存储对象并且它们被矩阵正确保留,这与使用 C 数组不同

首先创建一个 Row 对象,定义如下

- (id)initWithElementNumber:(NSUInteger)num {
    if (self = [super init]) {
        _row = [NSMutableArray arrayWithCapacity:num];
        for (int j = 0; j < num; j++)
            [_row addObject:[NSNull null]];
    }
    return self;
}

- (id)objectAtIndexedSubscript:(NSUInteger)idx {
    return self.row[idx];
}

- (void)setObject:(id)object atIndexedSubscript:(NSUInteger)idx {
    self.row[idx] = object;
}

@end

然后是一个使用之前定义的 Row 类的 Matrix 类:

@implementation UKMatrix

- (id)initWithRows:(NSUInteger)numRows columsn:(NSUInteger)numCol {
    if (self = [super init])
    {
        _numCol = numCol;
        _numRows = numRows;
        _rows = [NSMutableArray arrayWithCapacity:numRows];
        for (int j = 0; j < numRows; j++)
            [_rows addObject:[[UKRow alloc] initWithElementNumber:numCol]];
    }
    return self;
}

- (id)objectAtIndexedSubscript:(NSUInteger)idx {
    return self.rows[idx];
}

- (NSString *)description {
    NSString *matrixDesc = @"";
    for (int j = 0; j < self.numRows; j++) {
        matrixDesc = [matrixDesc stringByAppendingString:@"\n"];
        for (int k = 0; k < self.numCol; k++)
            matrixDesc = [matrixDesc stringByAppendingFormat:@" %@ ",self[j][k]];
    }
    return matrixDesc;
}

@end

那么您可以使用具有以下语法的 Matrix

UKMatrix *matrix = [[UKMatrix alloc] initWithRows:4 columsn:2];
matrix[1][1] = @2;
NSLog(@"%@", matrix);
于 2013-03-17T14:58:50.037 回答