Разве два определения не идентичны.
Абсолютно нет. Ключевое различие в двух определениях, которые вы указали, заключается в том, что «пока кто-то еще». Это «кто-то еще», который важен.
Обратите внимание на следующее:
__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>
, не указывается другой сильной ссылкой где-то еще / каким-либо другим способом «удержания»]