2D использование массивов NSMutableArray

Вы были правы в своем комментарии, но вместо этого используйте doTask().toSingleDefault("Completed");

44
задан Josh Caswell 14 October 2014 в 20:49
поделиться

4 ответа

Во-первых, необходимо выделить и инициализировать объекты перед использованием, чем-то как: NSMutableArray * sections = [[NSMutableArray alloc] initWithCapacity:10]; Для строк Вам нужен один объект для каждого, ни одного NSMutableArray * rows;

Второй, в зависимости от того, используете ли Вы Xcode 4.4 + (который представил индексирование, иначе section[i] & section[i] = …) Вам, вероятно, придется использовать [sections objectAtIndex:i] для чтения и [section replaceObjectAtIndex:i withObject: objectToAdd] для записи.

В-третьих, массив не может иметь дыр, т.е. obj1, ноля, obj2. Необходимо предоставить фактический объект каждому индексу. Если Вы ничего действительно не должны помещать, можно использовать NSNull объект.

Кроме того, не забывайте, что можно также хранить объекты Objective C в простых массивах C:

id table[lnum][rnum];
table[i][j] = myObj;
88
ответ дан Regexident 26 November 2019 в 21:45
поделиться

Если Вы хотите сделать это использование массивы, можно инициализировать Ваш sections массив, затем добавьте массив строк следующим образом:

NSMutableArray *sections = [[NSMutableArray alloc] init];
NSMutableArray *rows = [[NSMutableArray alloc] init];
//Add row objects here

//Add your rows array to the sections array
[sections addObject:rows];

Если Вы хотите добавить этот объект строк в определенном индексе, используйте следующее:

//Insert your rows array at index i
[sections insertObject:rows atIndex:i];

Можно затем изменить этот массив строк путем получения массива:

//Retrieve pointer to rows array at index i
NSMutableArray *rows = [sections objectAtIndex:i]
//modify rows array here

Вы могли всегда создавать свой собственный названный класс Section, который имеет NSMutableArray участника позвонили rows; затем Вы храните свои строки в этом массиве и храните Section объекты в массиве:

@interface Section : NSObject {
    NSMutableArray *rows;
}

Затем Вы просто создаете Section объекты, и можно создать методы в классе для добавления/удаления объектов строки. Затем Вы упаковываете весь Sections объекты в другом массиве:

Section *aSection = [[Section alloc] init];
//add any rows to your Section instance here

NSMutableArray *sections = [[NSMutableArray alloc] init];
[sections addObject:aSection];

Это становится более полезным, если Вы хотите добавить больше свойств для каждого Section экземпляр.

17
ответ дан Alex Rozanski 26 November 2019 в 21:45
поделиться

Язык не имеет никакой поддержки многомерных объектно-ориентированных массивов, но можно сделать класс, который делает это с помощью NSMutableArray, полного NSMutableArrays, как следующее. Я не попытался компилировать это или что-либо, я просто ввел его.

@interface SectionArray : NSObject {
  NSMutableArray *sections;
}
- initWithSections:(NSUInteger)s rows:(NSUInteger)r;
+ sectionArrayWithSections:(NSUInteger)s rows:(NSUInteger)r;
- objectInSection:(NSUInteger)s row:(NSUInteger)r;
- (void)setObject:o inSection:(NSUInteger)s row:(NSUInteger)r;
@end
@implementation SectionArray
- initWithSections:(NSUInteger)s rows:(NSUInteger)r {
  if ((self = [self init])) {
    sections = [[NSMutableArray alloc] initWithCapacity:s];
    NSUInteger i;
    for (i=0; i<s; i++) {
      NSMutableArray *a = [NSMutableArray arrayWithCapacity:r];
      for (j=0; j<r; j++) {
        [a setObject:[NSNull null] atIndex:j];
      }
      [sections addObject:a];
    }
  }
  return self;
}
+ sectionArrayWithSections:(NSUInteger)s rows:(NSUInteger)r {
  return [[[self alloc] initWithSections:s rows:r] autorelease];
}
- objectInSection:(NSUInteger)s row:(NSUInteger)r {
  return [[sections objectAtIndex:s] objectAtIndex:r];
}
- (void)setObject:o inSection:(NSUInteger)s row:(NSUInteger)r {
  [[sections objectAtIndex:s] replaceObjectAtIndex:r withObject:0];
}
@end

Вы использовали бы его как это:

SectionArray *a = [SectionArray arrayWithSections:10 rows:5];
[a setObject:@"something" inSection:4 row:3];
id sameOldSomething = [s objectInSection:4 row:3];
9
ответ дан Jack Nutting 26 November 2019 в 21:45
поделиться

К вашему сведению: код Джека требует большой работы, прежде чем он заработает. Среди других проблем, автозапуск может привести к освобождению данных до того, как вы получите к ним доступ, и его использование вызывает метод класса arrayWithSections: rows: когда он фактически определен как sectionArrayWithSections: rows:

Я могу попытаться опубликовать фактический рабочий код позже если у меня будет возможность.

0
ответ дан 26 November 2019 в 21:45
поделиться