1

Objective-C的语法通常我对待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 

我觉得很舒服瓦特/上述语法。但是我不太喜欢w/2D数组实例变量的语法,如NSUInteger 2dArray[10][10]

关于接口声明,合成getters/setters和内存管理,2d数组实例变量的Objective-c语法是什么?

回答

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,但你的想法。

+1

你有你方法定义中的一些额外的逗号! – mttrb 2012-04-25 15:29:59

+0

清理额外的逗号 – MrDatabase 2012-04-25 18:24:32

+0

@MrDatabase干杯。 – trojanfoe 2012-04-26 13:45:02

3

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

1

对于两维动阵列,您可以:

  1. 围棋与C数组(就像你在帖子中提到)
  2. 添加的NSMutableArray到NSMutableArray的
  3. 创建一个类来实现你的版本2D阵列

如果你只是想在你的数组中使用原始类型,所有三个都是好的。

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

供参考:

0

在IOS 6可以使用下标来定义使用方括号语法matrix[row][col]矩阵类,可存储对象和它们正确保留矩阵,不同于使用C数组

首先创建一个Row obj ECT,像这样定义

- (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 

然后使用前面定义的行类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 

那么你可以使用矩阵语法如下

UKMatrix *matrix = [[UKMatrix alloc] initWithRows:4 columsn:2]; 
matrix[1][1] = @2; 
NSLog(@"%@", matrix);