2017-01-24 1 views
5

В Swift, у нас есть нормальное значение по умолчанию печатаяSwift. Является ли (абсолютно) единственным конкретным преимуществом незаслуженных слабых, производительность?

  • в объект просто не может стать нулевым.

мы имеем слабый печатая

  • объект может стать нулевым. если объект становится нулевым, указатель автоматически становится нулевой, так что вы знаете, что объект стал нулевым

и мы бесхозный набрав

  • объект может стать нулевым. если объект становится нулевым, ничего вообще не происходит с указателем - вы влипли, если вы пытаетесь использовать его

(Итак: по следствию: один и единственный раз, когда вы можете использовать «бесхозными», если вы " абсолютно точно знать,»объект никогда не станет нулевым)

Сейчас:.

мне кажется, что следующее предложение,

является абсолютно правда ...

и абсолютно я имею в виду, действительно, действительно, абсолютно, вплоть до самых глубоких возможных философских проблем истинных ...

«Единственное различие между бесхозный и слабым, является производительность. Поскольку unowned не имеет проверки, это быстрее. Там нет абсолютно никакой другой разницы «

и, следовательно, логическое следствие:

„. Существует, абсолютно, нет оснований использовать бесхозные, кроме, если дополнительная производительность более слабый необходим“

.

{Помимо - единственное различием я могу думать о том, в самодокументирован смысла Если я использую бесхозным, он Кия моих коллег разработчиков к определенным вещам, давайте выделить что этот вопрос в настоящее время)

.

Так что мой вопрос прямо очень точные, очень специфические: смелые предложения выше «истины» (в «совершенно, очень, эффектно» истинном смысле истины).

+2

Не имеет большого значения тот факт, что вам не нужно разворачивать его каждый раз? –

+0

Правильные, неизменные переменные не являются необязательными, поэтому вы избегаете этих хлопот. – vacawama

+0

@JamesP - это может быть выдающаяся точка; возможно, ответ с иллюминативным примером может быть в порядке? – Fattie

ответ

3

Я согласен с Yannick. Ваши смелые заявления неверны. Недействительная ссылка должна быть действительна для ее срока службы. В программе -Ounchecked отказ от выполнения этого предварительного условия является неопределенным поведением. Я не имею в виду, «он падает». Я имею в виду, что это не хорошо сформированная программа; он не определен, что он делает. Слабая ссылка не может генерировать неопределенное поведение из-за ее выпуска, даже под -Ounchecked.

Использование unowned является заявлением программиста о том, что ссылка будет действительна в течение всего срока ее службы. Это даже не то, что Type! утверждает. ! просто утверждают, что ссылка будет действительна в той точке, к которой он обращается. Вот почему вы не можете проверить x == nil на unowned. Это необязательно. Это не «необязательно в маскировке» (например, Type!). Он всегда должен быть действительным.

В отличие от слабой ссылки, однако, бесхозный ссылка используется, когда другой экземпляр имеет тот же срок службы или более продолжительный срок службы. ... Ожидается, что неизменная ссылка всегда имеет значение. - [The Swift Programming Language]

Так к вашему «глубокие возможности философской,» бесхозной включает предварительное условие, которое не существует в слабых. Это предварительное условие существует вне программы и должно быть проверено программистом, а не компилятором, чтобы обеспечить хорошо сформированную программу.

Если есть причина использовать unowned, безусловно, если мы возьмем абсолютную позицию (как в вашем вопросе). Это самый жесткий тип в тех случаях, когда предварительное условие известно как истинное. weak - более слабый тип, чем unowned; он выражает меньше предварительных условий. Хорошая теория типов поощряет нас использовать самые сильные (наиболее ограничительные, наименьшие правовые значения) типы, которые мы можем, и unowned является более сильным типом, чем weak.

В не абсолютистском («практическом») смысле результатом выбора более сильного типа является более простой код. Когда вы используете weak, вам необходимо постоянно утверждать, что это не nil каждый раз, когда вы его используете, и обрабатываете случаи, когда они есть (возможно, вставляя fatalError, который просто переосмысливает unowned с большим количеством работы). Использование unowned позволяет вам утверждать это предварительное условие один раз. Это создает более простой и правильный код. Я никогда не использовал unowned для скорости. Я всегда использовал его, чтобы не отвечать снова и снова, но что, если это нуль? в коде, где он никогда не должен быть ник.

+1

Это глубокая мысль о том, что unowned * сильнее * ... приятно. Потрясающие. – Fattie

+1

«Я всегда использовал его, чтобы избежать ответа снова и снова», но что, если это нуль? »В коде, где он никогда не должен быть ник». Я думаю, это глубоко проницательно и действительно отвечает на «сердце» вопроса. – Fattie

3

Смелые предложения не верно.

Weak не является обязательным и может быть установлен в любое время.

Unowned не является обязательным, но может быть равен нулю. Если это произойдет, и вы называете это крахом вашего приложения. Он должен быть установлен во время инициализации.

Еще одно отличие - производительность, как заявил автор. Unowned не делает никаких проверок и незначительно быстрее, чем weak.

Это лучше показывает взаимосвязь между классами.

Вы можете проверить это так вопрос для получения более подробной информации: What is the difference between a weak reference and an unowned reference?

+0

'Unowned' не является необязательным на поверхности, но может внезапно стать нулевым (или недействительным указателем, лучше формулировать) и разрушить ваше приложение, если оно будет использоваться неправильно. – user28434

+0

Правда, но я не хотел вдаваться в подробности. Опубликованная ссылка охватывает это гораздо более подробно, плюс автор фактически сказал это сам. – Yannick

+0

Эй @ Янник - спасибо за это; Я склонен сказать «но есть ли какие-то отличия, кроме этого» :), что, возможно, не в духе моего вопроса, хотя :) – Fattie

Смежные вопросы