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);