Цель C: Каков наилучший способ создания и использования динамического логического массива? - PullRequest
0 голосов
/ 29 октября 2010

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

@interface myDelegate : NSObject
{
   NSMutableArray *aShowNote;
}
@property (nonatomic, copy) NSMutableArray *aShowNote;

Вот как я инициализировал свой массив:

NSMutableArray *aShow = [[NSMutableArray alloc] init]; 
for (i=0; i < c; i++) 
    [aShow addObject:[NSNumber numberWithBool:false]];
self.aShowNote = aShow;

Кажется, это работает нормально, но я сбит с толку, почему каждый элемент инициализируется с одинаковым адресом.

Но то, что я обнаружил в своих исследованиях, так это то, что вам нужно заменить объект, если вы хотите изменить его значение:

myDelegate *appDelegate = (myDelegate *)[[UIApplication sharedApplication] delegate];
NSInteger recordIndex = 1;

NSNumber *myBoolNo = [appDelegate.aShowNote objectAtIndex:recordIndex];
BOOL showNote = ![myBoolNo boolValue];

[appDelegate.aShowNote replaceObjectAtIndex:recordIndex withObject:[NSNumber numberWithBool:showNote]];

но этот подход кажется слишком сложным (и он тоже дает сбой).

Завершение приложения из-за необработанного исключения «NSInvalidArgumentException», причина: '- [__ NSArrayI replaceObjectAtIndex: withObject:]: нераспознанный селектор, отправленный экземпляру 0x5b51d00

Любые указатели для улучшения этого кода (и, конечно, для его работы) будут очень благодарны.

Спасибо

Iphaaw

Ответы [ 4 ]

3 голосов
/ 29 октября 2010

проблема в том, что copy в свойстве копирует назначенный объект. И копия создает неизменные объекты.

Измените вашу собственность на: @property (nonatomic, retain) NSMutableArray *aShowNote;


И я думаю, что улучшать особо нечего, насколько я знаю, это путь, если вы хотите NSArray с логическими значениями.

2 голосов
/ 29 октября 2010

Почему бы не использовать простой C для этого простого случая?

BOOL *aShow = malloc(sizeof(BOOL)*c);
for (i=0 ; i<c ; i++)
    aShow[i] = false;

Вам просто нужно помнить free(aShow), когда вы закончите с ним.

1 голос
/ 29 октября 2010

Невозможно изменить значение NSNumber.Это не изменяемый класс.
Затем, когда вы запрашиваете два одинаковых значения, возвращается один и тот же объект.

В вашем массиве init, почему вы не инициализируете массив напрямую, чтобы избежать проблемы копирования:1004 *

aShowNote  = [[NSMutableArray alloc] init]; 
for (i=0; i < c; i++) {
    [aShowNote addObject:[NSNumber numberWithBool:false]];
}
0 голосов
/ 29 октября 2010

Я озадачен, почему каждый элемент инициализируется с одинаковым адресом.

Почему?NSNumbers являются неизменными.Для выполнения требуется только один объект NSNumber для представления значения FALSE.

...