【问题标题】:How to simplify my code... 2D NSArray in Objective C...?如何简化我的代码……Objective C 中的 2D NSArray……?
【发布时间】:2010-04-06 09:12:06
【问题描述】:
 self.myArray = [NSArray arrayWithObjects: [NSArray arrayWithObjects: [self generateMySecretObject], [self generateMySecretObject],nil], [NSArray arrayWithObjects: [self generateMySecretObject], [self generateMySecretObject],nil],nil]; 

 for (int k=0; k<[self.myArray count]; k++) {
  for(int s = 0; s<[[self.myArray objectAtIndex:k] count]; s++){
   [[[self.myArray objectAtIndex:k] objectAtIndex:s] setAttribute:[self generateSecertAttribute]];
  }
 }

如您所见,这是一个简单的 2*2 数组,但我首先需要大量代码来分配 NSArray,因为我发现 NSArray 一开始就无法分配大小。另外,我想一一设置属性。我想不出我的数组是否更改为 10*10。可能要多久。所以,我希望你们能给我一些关于缩短代码和提高可读性的建议。 thz

(一些假设:myArray 将具有固定大小。它不会在运行时变大或变小。)

【问题讨论】:

    标签: objective-c arrays optimization multidimensional-array


    【解决方案1】:

    通过-addObject:生成数组。

    NSMutableArray* myArray = [NSMutableArray array];
    for (int k = 0; k < 10; ++ k) {
      NSMutableArray* subArr = [NSMutableArray array];
      for (int s = 0; s < 10; ++ s) {
        id item = (s == 0 && k == 0) ? [self d] : [self generateMySecretObject];
        [item setAttribute:[self generateSecertAttribute]];
        [subArr addObject:item];
      }
      [myArray addObject:subArr];
      // use [myArray addObject:[[subArr copy] autorelease]] for deep immutability.
    }
    return [[myArray copy] autorelease];
    

    (不要多次查询self.myArray。每个都对应一个ObjC调用,虽然有人调用ObjC调用很便宜,但它仍然不是免费的。)

    【讨论】:

    • NSMutableArray 比 NSArray 好?我的二维数组是固定大小的。我觉得NSArray更合适
    • @Tattat:请参阅更新以获取不可变数组。您必须先创建一些不可变结构,它可能是 NSMutableArray 或 id[10][10] 等。
    • 我害怕使用NSMutableArray,因为它不提供count,objectAtIndex,这种方法。我对这些方法很熟悉。
    • @Tattat: NSMutableArray 继承自 NSArray,所以任何 NSArray 都可以,NSMutableArray 也可以。
    【解决方案2】:

    如果数组是固定大小并且每一行的长度相同,那么您可以使用一维数组和偏移量,例如:

    int rowLength = 5;
    int rowNumber = 0;
    int columnNumber = 3;
    
    [myArray objectAtIndex: (rowLength * rowNumber) + columnNumber];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多