Могу ли я повторно использовать мой указатель после его добавления в изменяемый массив?
Допустим, у меня есть массив со строками.
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 ответа
Это хорошо для повторного использования someObject
; если вы думаете об этом, вы уже используете name
каждый раз, когда вы проходите через цикл.
-addObject:
может или не может скопировать объект, который вы передаете. (Это не так - он сохраняет объект, а не копирует его, но вполне возможно, что некоторый подкласс NSMutableArray мог бы скопировать вместо этого.) Важно то, что этот код действительно не должен ' наплевать на что -addObject:
делает.
Также не упускайте из виду различие между указателем и объектом, на который он указывает. Указатели являются просто ссылками, и указатель копируется каждый раз, когда вы передаете его в метод или функцию. (Как и C, Objective-C передает параметры по значению, поэтому передача указателя в метод приводит к тому, что значение указателя помещается в стек.) Однако сам объект не копируется.
Я думаю, что вы запутались в концепции указателя здесь. Когда ты сказал someObject = [[[SomeClass alloc] init...
вы в основном указываете someObject
указатель на новый объект. Итак, чтобы ответить на ваш вопрос - ваш текущий код в порядке.
Что касается того, поддерживают ли массивы копии объектов, добавленных к ним - НЕТ, массив сохраняет объект, который вы добавляете к нему. Тем не менее, это не имеет значения для вашего кода выше.
Короткий ответ: нет, вам не нужно беспокоиться о повторном использовании someObject
,
Чуть более длинный ответ: задание -someObject = ...
назначает новое значение указателя someObject
переменная; addObject:
затем получить это значение, а не адрес someObject
сам.