ссылки на коллекции в obj-c - PullRequest
       1

ссылки на коллекции в obj-c

0 голосов
/ 08 декабря 2011

Я новичок в Obj-C, и у меня есть небольшая проблема здесь.

Я пытаюсь вставить значения из временного словаря в массив

NSMutableDictionary *myDict = [[NSMutableDictionary alloc] init];
NSMutableArray *myArray = [[NSMutableArray alloc] init];

[myDict setObject:[NSNumber numberWithInt:100] forKey:@"Record"];
[myDict setObject:@"www" forKey:@"Name"];
[myArray addObject:myDict];

[myDict setObject:[NSNumber numberWithInt:80] forKey:@"Record"];
[myDict setObject:@"eee" forKey:@"Name"];
[myArray addObject:myDict];

[myDict setObject:[NSNumber numberWithInt:70] forKey:@"Record"];
[myDict setObject:@"rrr" forKey:@"Name"];
[myArray addObject:myDict];

[myDict setObject:[NSNumber numberWithInt:0] forKey:@"Record"];
[myDict setObject:@"ttt" forKey:@"Name"];
[myArray addObject:myDict];

NSLog(@"myArray %@",myArray);

Независимо от плохого кода реализации (и моего плохого английского: p), я пытаюсь выяснить, как мне чистить myDict после каждой вставки в myArray.

Использование [myDict removeAllObjects]; после каждого addObject дает мне пустой массив в конце.

Спасибо!

Спасибо за все ваши ответы, с [myArray addObject:[[myDict copy] autorelease]]; код работает просто отлично.

Ответы [ 3 ]

4 голосов
/ 08 декабря 2011

Проблема в том, что вы снова и снова добавляете в массив постоянно изменяемый словарь . Таким образом, ваш массив - это просто набор ссылок на один и тот же объект. Поэтому не удивительно, что каждый объект в вашем массиве идентичен последнему.

Чтобы сделать то, что вы хотите, у вас есть два варианта. Первый - каждый раз копировать изменяемый словарь и добавлять эту копию в массив. Вы можете сделать это с помощью

[myArray addObject:[[myDict copy] autorelease]];

Другое решение - использовать отдельные словари для начала. Вместо того, чтобы каждый раз менять мутирующий словарь, вы можете создать совершенно новый NSDictionary:

[myArray addObject:[NSDictionary dictionaryWithObjectsAndKeys:
                    [NSNumber numberWithInt:100], @"Record",
                    @"www", @"Name",
                    nil]];

[myArray addObject:[NSDictionary dictionaryWithObjectsAndKeys:
                    [NSNumber numberWithInt:80], @"Record",
                    @"eee", @"Name",
                    nil]];
2 голосов
/ 08 декабря 2011

Я думаю, вам нужно скопировать словарь, прежде чем добавить его в массив ...

[myArray addObject:[[myDict copy] autorelease]];

Тогда вы можете использовать [myDict removeAllObjects] как обычно.

0 голосов
/ 08 декабря 2011

NSMutableDictionary *, как предполагает *, - указатель на объект словаря. Поэтому, когда вы добавляете его в массив, это все тот же объект - на который указывает myDict, а также на элемент в массиве. Поэтому я предлагаю вам создавать новый словарь после каждого добавления:

NSMutableDictionary *myDict = [[NSMutableDictionary alloc] init];
NSMutableArray *myArray = [[NSMutableArray alloc] init];

[myDict setObject:[NSNumber numberWithInt:100] forKey:@"Record"];
[myDict setObject:@"www" forKey:@"Name"];
[myArray addObject:myDict];

myDict = [[NSMutableDictionary alloc] init];

[myDict setObject:[NSNumber numberWithInt:80] forKey:@"Record"];
[myDict setObject:@"eee" forKey:@"Name"];
[myArray addObject:myDict];

Я предполагаю, что вы используете ARC в приведенном выше коде.

Тем не менее, более объективный способ был бы сделать:

    [myArray addObject: [NSDictionary dictionaryForObjectsAndKeys: [NSNumber numberWithInt:80], @"Record", @"www", @"Name"]]; 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...