Можно ли повторно использовать мой указатель после его добавления в изменяемый массив? - PullRequest
2 голосов
/ 12 мая 2011

Допустим, у меня есть массив со строками.

NSArray *names = [NSArray arrayWithObjects: @"One", @"Two", @"Three", nil];

Я хочу инициировать объекты некоторого пользовательского класса и добавить их в изменяемый массив.Я использую пользовательский метод init, который принимает строковый аргумент.

Чтобы быть более точным, я хочу [SomeClass alloc] initWithName: aName] и добавить полученный объект к NSMutableArray.

I 'Я думаю об использовании быстрого перечисления Objective-C.Итак, что я получаю:

NSMutableArray *objects = [NSMutableArray arrayWithCapacity: [names count];

for (NSString *name in names) {
    [objects addObject: [[[SomeClass alloc] initWithName: name] autorelease]];
}

Проблема в том, что я не могу добавить nil в массив, и мне не нравится обработка исключений.Тем не менее, мой метод инициации может вернуть nil.Поэтому я решил проверить, прежде чем добавлять (профилактика).Мой новый цикл for:

SomeClass *someObject;

for (NSString *name in names) {
    someObject = [[[SomeClass alloc] initWithName: name] autorelease];
    if (someObject) {
        [objects addObject: someObject];
    }
}

Теперь, вместо того, чтобы немедленно передавать новый объект в массив, я сначала устанавливаю указатель someObject, а затем передаю указатель на массиввместо этого.

Этот пример вызывает у меня вопрос.Когда я someObject = [[[SomeClass alloc] initWithName: name] autorelease] в цикле, меняются ли существующие объекты (которые добавляются с использованием того же указателя) в массиве тоже?

Другими словами: метод addObject: (id)someObject создает новыйвнутреннюю копию указателя, которую я передаю, или мне нужно создать копию указателя - я не знаю, как - и передать копию самостоятельно?

Большое спасибо!: -)

Ответы [ 4 ]

3 голосов
/ 12 мая 2011

Хорошо использовать повторно someObject; если вы думаете об этом, вы уже используете name каждый раз, когда проходите цикл.

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

Кроме того, не упускайте из виду различие между указателем и объектом, на который он указывает. Указатели являются просто ссылками, и указатель копируется каждый раз, когда вы передаете его в метод или функцию. (Как и C, Objective-C передает параметры по значению, поэтому передача указателя в метод приводит к тому, что значение указателя помещается в стек.) Однако сам объект не копируется.

2 голосов
/ 12 мая 2011

Я думаю, вы запутались в концепции указателя здесь.Когда вы говорите someObject = [[[SomeClass alloc] init..., вы в основном указываете указатель someObject на новый объект.Итак, чтобы ответить на ваш вопрос - ваш текущий код в порядке.

Что касается того, хранят ли массивы копии добавленных к ним объектов - НЕТ, массив сохраняет объект, который вы добавили к нему.Однако это не имеет значения для вашего кода выше.

2 голосов
/ 12 мая 2011

Короткий ответ: нет, вам не нужно беспокоиться о повторном использовании someObject.

Немного более длинный ответ: назначение - someObject = ... назначает новое значение указателя переменной someObject;Затем addObject: получает это значение, а не адрес самого someObject.

0 голосов
/ 21 июня 2011

Три20 дает ответ!

...