2011-01-08 3 views
0

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

Пример кода:

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

     return obj; // implicit retain 
    } 

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

ответ

1

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

MyObject *obj = ... 
MyObject *aCopy = [obj copy]; 
... do stuff with aCopy 
[aCopy release]; 
+0

Okkkk, отправитель вызова, а не отправитель объекта. Это более понятно. Но я действительно схожу с ума. Итак ... я могу передать myObject.var = [localvar copy] с свойством в myObject, определенным как сохранение, и выпущен в dealloc. Это будет хорошо, не так ли? – Oliver

+0

@Oliver - вы будете слишком осторожны, если вы это сделаете. Если свойство 'var' объявлено как' keep', то правильным присваиванием будет 'myObject.var = [[localvar copy] autorelease]'. Но похоже, что вы действительно хотите объявить свойство как 'copy', тогда вы можете просто выполнить' myObject.var = localvar'. –