Разве эти два определения не идентичны.
Точно нет. Ключевое различие между двумя определениями, на которые вы указали, - это «до тех пор, пока кто-то другой». Важно «кто-то другой».
Учтите следующее:
__strong id strongObject = <some_object>;
__weak id weakObject = strongObject;
Теперь у нас есть два указателя <some_object>, один сильный и один слабый. Если мы устанавливаем , strongObjectчтобы nilвыглядеть примерно так:
strongObject = nil;
Затем, если вы выполните изложенные вами правила, вы зададите себе следующие вопросы:
Сильный: «держите это в куче, пока я не перестану указывать на это»
strongObjectбольше не указывает <some_object>. Так что нам не нужно его хранить.
Слабое: «держите это, пока на это сильно указывает кто-то другой»
weakObjectвсе еще указывает на <some_object>. Но поскольку на это никто не указывает, это правило также означает, что нам не нужно его соблюдать.
В результате он <some_object>освобождается, и если ваша среда выполнения поддерживает его (Lion и iOS 5 и выше), тогда weakObjectавтоматически будет установлено значение nil.
Теперь посмотрим, что произойдет, если мы сделаем weakObjectэто nilтак:
weakObject = nil;
Затем, если вы выполните изложенные вами правила, вы зададите себе следующие вопросы:
Сильный: «держите это в куче, пока я не перестану указывать на это»
strongObjectуказывает на <some_object>. Так что нам нужно его сохранить.
Слабое: «держите это, пока на это сильно указывает кто-то другой»
weakObjectне указывает на <some_object>.
Результатом является то , что <some_object>это не освобождаться, но weakObjectбудет nilуказатель.
[Обратите внимание, что все, что предполагается <some_object>, не указано в другой сильной ссылке где-то еще / каким-либо другим способом «удержания»]