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