Могу ли я повторно использовать мой указатель после его добавления в изменяемый массив?

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

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

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

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

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

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

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

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

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 ответа

Решение

Three20 дает ответ!

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

-addObject: может или не может скопировать объект, который вы передаете. (Это не так - он сохраняет объект, а не копирует его, но вполне возможно, что некоторый подкласс NSMutableArray мог бы скопировать вместо этого.) Важно то, что этот код действительно не должен ' наплевать на что -addObject: делает.

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

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

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

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

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

Другие вопросы по тегам