В книге говорится следующее:
Итак, как вы знаете, когда объект принадлежит, и кем? Рассмотрим следующий пример:
NSString *str = [[NSString alloc] initWithString:@"Hello"]; NSString *str2 = str;
В этом примере вы используете ключевое слово
alloc
дляstr
, поэтому вы владеетеstr
. Поэтому вам нужно освободить его, когда он больше не нужен. Однако,str2
просто указывает наstr
, поэтому вы не являетесьstr2
, что означает, что вы не нужно отпускатьstr2
, когда вы закончите использовать его.
Я думал, что собственность - это объект, а не переменная или указатель... поэтому мы не можем сказать, что мы "владеем str
" или "own str2
"... у нас есть объект, на который указывает либо str
или str2
, и если мы используем [str release]
или [str2 release]
, это все равно.
Другое описание:
Например, рассмотрим пример, использованный в предыдущем разделе:
NSString *str = [[NSString alloc] initWithString:@"Hello"]; NSString *str2 = str; [str release]; [str2 release]; //---this is not OK as you do not own str2---
Попытка освободить
str2
приведет к ошибке выполнения, поскольку вы не может освободить объект, не принадлежащий вам.
Мы можем использовать [str2 release]
, если он вызывается до [str release]
. Если мы это сделаем, то строка [str release]
вызовет ошибку, так как теперь str
, а также str2
являются обманутыми указателями, и предположительно, когда release
был отправлен объекту в первый раз, счетчик ссылок стал 0 и dealloc
вызывается немедленно, а память освобождается функцией C free()
.
Правильно ли это, или, возможно, что-то еще нужно исправить?