iPhone: copyWithZone: освобождать объект перед его возвратом?

Я прочитал в документации Apple о copyWithZone : «Возвращенный объект неявно сохраняется отправителем, который несет ответственность за его выпуск». Но... Как я могу что-то выпустить, я возвращаюсь... Я схожу с ума!

Пример кода:

    - (id)copyWithZone:(NSZone *)zone {
        MyObject* obj = [[[self class] allocWithZone:zone] init]; // explicit retain
        [obj fillTheObj];

        return obj; // implicit retain
    }

Где должен быть указанный релиз? Я сохраняю дважды? Эээ...


person Oliver    schedule 08.01.2011    source источник


Ответы (1)


Отправитель отвечает за выпуск. Это означает, что тот, кто вызывает ваш метод копирования, становится владельцем, то есть:

MyObject *obj = ...
MyObject *aCopy = [obj copy];
... do stuff with aCopy
[aCopy release];
person Daniel Dickison    schedule 08.01.2011
comment
Okkkk, отправитель вызова, а не отправитель объекта. Это более ясно. Но я действительно схожу с ума. Итак... я могу передать myObject.var = [localvar copy] со свойством в myObject, определенным как сохранение и освобожденным в Dealloc. Это бы сработало, не так ли? - person Oliver; 08.01.2011
comment
@Oliver - если вы это сделаете, вы будете слишком удержаны. Если свойство var объявлено как retain, то правильным назначением будет myObject.var = [[localvar copy] autorelease]. Но похоже, что вы действительно хотите объявить свойство как copy, тогда вы можете просто сделать myObject.var = localvar. - person Daniel Dickison; 08.01.2011