2012-05-23 2 views
2

ли следующие условия:@property из Objective-C

слабый = unsafe_unretain = присвоить

сильные = сохраняют

Если почему они дублируются? Какой из них выбрать?

ответ

6

Нет, это неправда. weak означает, что объект не сохраняется, и, кроме того, значение переменной/будет автоматически установлено на нуль, когда объект будет освобожден. unsafe_unretained означает, что объект не сохранен, но нет автоматического обнуления. strong и retain эквивалентны.

+0

, если объект освобожден, и указатель на него не обнуляется (не установлен на ноль), так что указывает указатель на данный момент? – itenyh

+0

Он будет указывать на то же место в памяти, что и объект, но попытки получить к нему доступ (путем отправки сообщения ему) могут привести к сбою EXC_BAD_ACCESS. Другими словами, произойдут плохие вещи, что объясняет преимущество использования свойства «слабый». Сообщения в 'nil' являются доброкачественными и просто ничего не делают в Objective-C. –

1

weak! = unsafe_unretain

weak автоматически преобразует его указатель на nil, если объект он указывает на это освобождаться.

Двигаясь вперед, вы должны использовать strongweak & для объектов и assign для примитивных типов

+0

если объект освобожден, а указатель на него не установлен на ноль, то что указывает указатель на данный момент? – itenyh

+0

Указывает на освобожденную память. Если вы попытаетесь получить к нему доступ, ваше приложение выйдет из строя. – trapper

+0

, если он установлен в ноль, ничего не произойдет? – itenyh

2

assign обычно используется для примитивов, как int или double, так как вы просто назначая. unsafe_unretained используется для объектов Objective-C, которые вы знаете не сохраняются и понимаете, почему это небезопасно. weak - это новая функция, представленная в iOS 5, которая похожа на unsafe_unretained, но имеет различную семантику с ARC. Ознакомьтесь с руководством Apple Advanced Memory Management для получения дополнительной информации.

На практике вы почти никогда не будете использовать unsafe_unretained, если вы настроите iOS 5 или выше.

+0

+1. и http://clang.llvm.org/docs/AutomaticReferenceCounting.html – 0x8badf00d

+0

, поэтому, если включен ios4, небезопасным будет выбран выбор? – itenyh

+0

большую часть времени, да. –

2
  • strong: переменная сохраняется во время ее применения. сохранить также работает как синоним сильного.
  • copy: создает и сохраняет копию.
  • weak: используйте его, чтобы указать на объект, не требуя права собственности. После того, как объект будет выпущен, указатель будет нулевым.
  • unsafe_unretained: тот же, что и слабый, но не ноль указателя после выпуска.
  • assign: примитивные значения.

Если вы ориентируетесь на iOS 4, вы не можете использовать слабый. Вместо этого используйте unsafe_unretained.
Прежде чем ARC, свойства по умолчанию были назначены, теперь по умолчанию сильно.

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