【问题标题】:Objective-c syntax for 2d array instance variable二维数组实例变量的 Objective-c 语法
【发布时间】:2012-05-06 07:23:18
【问题描述】:

通常我这样对待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

我对上面的语法感觉很舒服。但是,对于像NSUInteger 2dArray[10][10] 这样的二维数组实例变量的语法,我不太适应。

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

【问题讨论】:

    标签: objective-c arrays memory-management syntax instance-variables


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      您不需要需要为您的数组分配内存;在类中定义它们非常好,并且它们将始终以相同的大小存在。因此,您无需担心内存管理,您的 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 进行范围检查,但您明白了。

      【讨论】:

      • 你的方法定义中有一些额外的逗号!
      【解决方案3】:

      对于二维数组,您可以:

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

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

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

      仅供参考:

      【讨论】:

        【解决方案4】:

        在 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
        

        那么您可以使用以下语法的矩阵

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

        【讨论】:

          猜你喜欢
          • 2013-02-02
          • 2023-04-04
          • 1970-01-01
          • 1970-01-01
          • 2015-09-01
          • 2010-10-07
          • 2011-05-07
          • 1970-01-01
          • 2011-12-19
          相关资源
          最近更新 更多