Добавление нескольких объектов NSO в NSMutableArray - PullRequest
3 голосов
/ 18 декабря 2011

С помощью следующего кода оба элемента в массиве одинаковы (последний элемент). Что я делаю не так, что заставляет этот массив перезаписывать значения? Я пытаюсь использовать 1 объект, поэтому мне не нужно создавать экземпляр количества объектов X.

self.myArray = [[NSMutableArray alloc] init];

MyObjClass *obj = [[MyObjClass alloc] init];
obj.firstName = @"First Name";
obj.lastName = @"Last Name";
obj.created = @"Dec 17 16:24";
[self.myArray addObject:obj];

obj.firstName = @"First Name2";
obj.lastName = @"Last Name2";
obj.created = @"Dec 18 7:41";
[self.myArray addObject:obj];

В MyObjClass.h У меня @interface MyObjClass : NSObject. NSObject неправильный тип данных?

Свойства в MyObjClass.h:

@property (strong) NSString *firstName;
@property (strong) NSString *lastName;

А от MyObjClass.m:

@synthesize firstName, lastName;

Ответы [ 5 ]

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

Массив не перезаписывает значения, вы в своем коде. У вас есть один экземпляр MyObjClass. * obj - указатель на эти объекты, и когда вы добавляете его в массив дважды, массив имеет два индекса, которые указывают на объект, который вы добавили дважды.

Устанавливая свойства для obj, вы изменяете значения этого одного объекта, на который указывает и указатель * obj, и массив.

Почему вас беспокоит создание X-объектов? Звучит так, как будто вы хотите, чтобы объекты X находились в массиве с разными значениями.

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

EDIT:

Исходя из вашего комментария ниже, похоже, что вы беспокоитесь о нескольких объектах вокруг управления памятью. Когда вы добавляете объект в массив, он сохраняет объект, поэтому после того, как вы добавите его (если вы закончили с этим в этой области), затем отпустите или автоматически освободите его. Когда массив освобожден, он вызовет release для всех объектов в массиве. Вам нужно n объектов, независимо от того, инициализируете ли вы или копируете - у вас все еще есть несколько объектов. Отпустите их, а затем отпустите массив после его освобождения.

1 голос
/ 18 декабря 2011

Вам необходимо создать уникальный экземпляр для каждого добавляемого объекта. Также obj должен быть освобожден в этом методе, потому что добавление его в массив сохраняет его. Однако, если вы используете ARC, освобождение не требуется / не разрешается.

self.myArray = [[NSMutableArray alloc] init];

MyObjClass *obj;

obj = [[[MyObjClass alloc] init] autorelease];
obj.firstName = @"First Name";
obj.lastName = @"Last Name";
obj.created = @"Dec 17 16:24";
[self.myArray addObject:obj];

obj = [[[MyObjClass alloc] init] autorelease];
obj.firstName = @"First Name2";
obj.lastName = @"Last Name2";
obj.created = @"Dec 18 7:41";
[self.myArray addObject:obj];
0 голосов
/ 18 декабря 2011

Вы неправильно понимаете метод и объекты -addObject: в целом. Вы добавляете ссылку (указатель) на ваш экземпляр MyObjClass в массив. Если вы добавляете один и тот же экземпляр дважды, это не имеет значения. Кроме того, поскольку вы храните только указатель на объект в массиве, у вас всегда есть последняя «версия» вашего объекта в массиве.

Вам нужно выделить два экземпляра и добавить их оба:

MyObjClass *object1 = ...;
[array addObject:object1];
MyObjClass *object2 = ...;
[array addObject:object2];
0 голосов
/ 18 декабря 2011

Попробуйте установить свойства в вашем классе MyObjClass следующим образом:

@property (copy) NSString *firstName;
@property (copy) NSString *lastName;
@property (copy) NSString *created;
0 голосов
/ 18 декабря 2011

При добавлении объектов в NSMutableArray они сохраняются, а не копируются. Если вы не хотите изменять включенный объект, используйте следующую последовательность кода:

self.myArray = [[NSMutableArray alloc] init];

MyObjClass *obj = [[MyObjClass alloc] init];
obj.firstName = @"First Name";
obj.lastName = @"Last Name";
obj.created = @"Dec 17 16:24";
[self.myArray addObject:[[obj copy] autorelease]];

obj.firstName = @"First Name2";
obj.lastName = @"Last Name2";
obj.created = @"Dec 18 7:41";
[self.myArray addObject:obj]; // if you're using it further then you need to make a copy of it again
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...