Цель-C дуга: сильный против сохранения и слабый против назначения



есть два новых атрибута управления памятью для свойств, введенных ARC,strong и weak.



помимо copy, что, очевидно, что-то совершенно другое,есть ли какие-либо различия между strong vs retain и weak vs assign?



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



я не знаю ни о каких различиях между strong и retain.



есть ли причина, почему я должен использовать assign и retain в новых проектах, или тот устарел?

612   8  

8 ответов:

С переход к заметкам о выпуске ARC (пример в разделе об атрибутах свойств).

// The following declaration is a synonym for: @property(retain) MyClass *myObject;

@property(strong) MyClass *myObject;

так strong это то же самое, что и retain в объявлении свойства.

для проектов ARC я бы использовал strong вместо retain, Я хотел бы использовать assign для примитивных свойств C и weak для слабых ссылок на объекты Objective-C.

прочитав так много статей StackOverflow сообщений и демонстрационных приложений для проверки атрибутов переменных свойств, я решил собрать всю информацию атрибутов вместе:

  1. atomic / / default
  2. неатомической
  3. strong=сохранить / / default
  4. слабый
  5. сохранить
  6. назначение //по умолчанию
  7. unsafe_unretained
  8. скопировать
  9. только для чтения
  10. чтение и запись //по умолчанию:

Ниже приведена подробная ссылка на статью, где вы можете найти все вышеупомянутые атрибуты, которые, безусловно, помогут вам. Огромное спасибо всем людям, которые дают лучшие ответы здесь!!

атрибуты или модификаторы переменных свойств в iOS

1.сильный (iOS4 = сохранить)

  • он говорит: "Держите это в куче, пока я не укажу на него больше"
  • другими словами "Я владелец, вы не можете освободить это до цели штраф с тем же, как сохранить"
  • вы используете strong только если вам нужно сохранить объект.
  • по умолчанию все переменные и локальные переменные являются сильными указатели.
  • мы обычно используем strong для UIViewControllers (родители элемента пользовательского интерфейса)
  • strong используется с ARC , и это в основном помогает вам, не беспокоясь о сохранении количества объектов. ARC автоматически освобождает его для вас, когда вы закончите с ним.С помощью ключевого слова означает, что вы владеете предметом.

пример:

@property (strong, nonatomic) ViewController *viewController;

@synthesize viewController;

2.слабый -

  • он говорит: "Держите это до тех пор, пока кто-то другой указывает на это сильно"
  • то же самое, что назначить, не сохранить или освободить
  • "слабая" ссылка-это ссылка, которую вы не сохраняете.
  • мы вообще используем слабый для IBOutlets (Дети UIViewController).Это работает, потому что дочерний объект должен существовать только до тех пор, пока это делает родительский объект.
  • слабая ссылка-это ссылка, которая не защищает объект ссылки от сбора сборщиком мусора.
  • слабый по существу присваивает, нерасчлененное свойство. Кроме того, когда объект освобождается слабый указатель автоматически устанавливается в nil

пример :

@property (weak, nonatomic) IBOutlet UIButton *myButton;

@synthesize myButton;

Сильный И Слабый Объяснение,спасибо BJ Homer:

представьте, что наш объект-собака, и что собака хочет убежать (быть освободившему.)

сильные указатели, как поводок на собаку. Как долго, как вы имеете поводок привязан к собаке, собака не убежит. Если пять человек прикрепите их поводок к одной собаке, (пять сильных указателей на один объект), тогда собака не убежит, пока все пять поводков не будут отсоединены.

слабые указатели, с другой стороны, похожи на маленьких детей, указывающих на собака и говорит: "Смотри! Собака!"Пока собаки по-прежнему на поводок, маленькие дети все еще могут видеть собаку, и они все еще будут указывать к нему. Как только все поводки отсоединяются, собака бежит независимо от того, сколько маленьких детей указывают на это.

как только последний сильный указатель (поводок) больше не указывает на объект, объект будет освобожден, и все слабые указатели будет обнулился.

когда мы используем слабые?

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

3.сохранить сильные=

  • он сохраняется, старое значение освобождается и ему присваивается сохранить указывает, что новое значение должно быть отправлено
  • сохранить по назначению и старый отправлено-выпуска стоимостью
  • сохранить то же самое, что и сильный.
  • apple говорит, что если вы пишете сохранить он будет автоматически преобразован/работать как сильный только.
  • такие методы, как "alloc" включают неявное "сохранить"

пример:

@property (nonatomic, retain) NSString *name;

@synthesize name;

4.назначить

  • присвоить значение по умолчанию и просто выполняет переменной задание
  • assign-это атрибут свойства, который сообщает компилятору, как синтезировать реализация сеттера свойства
  • Я бы использовал assign для примитивных свойств C и слабых для слабых ссылок на объекты Objective-C.

пример:

@property (nonatomic, assign) NSString *address;

@synthesize address;

насколько я знаю, strong и retain являются синонимами, поэтому они делают ровно то же самое.

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

это означает, что вы можете просто заменить их.

, есть один особый случай, с которым я столкнулся, где мне пришлось использовать assign, а не weak. Допустим, у нас есть два свойства delegateAssign и delegateWeak. В обоих хранится наш делегат, то есть владеющий нами, имея единственную сильную ссылку. Делегат освобождает, так что наш -dealloc метод тоже называется.

// Our delegate is deallocating and there is no other strong ref.
- (void)dealloc {
    [delegateWeak doSomething];
    [delegateAssign doSomething];
}

делегат уже находится в процессе освобождения, но еще не полностью освобожден. Проблема в том, что weak ссылки на него уже недействителен! свойства delegateWeak содержит nil, но delegateAssign содержит допустимый объект (со всеми уже выпущенными свойствами и аннулировано, но все еще действует).

// Our delegate is deallocating and there is no other strong ref.
- (void)dealloc {
    [delegateWeak doSomething]; // Does nothing, already nil.
    [delegateAssign doSomething]; // Successful call.
}

это совершенно особый случай, но он показывает нам, как те weak переменные работают и когда они обнуляются.

неатомической/атомная

  • неатомный гораздо быстрее, чем атомный
  • всегда используйте неатомные, если у вас нет очень специфических требований к atomic, которые должны быть редкими (atomic не гарантирует потокобезопасность - только остановки доступа к свойству, когда оно одновременно устанавливается другим потоком)

сильный / слабый / назначить

  • использовать сильный для сохранения объектов-хотя ключевое слово сохранить является синонимом, лучше всего использовать strong вместо
  • использовать слабый если вы хотите только указатель на объект, без сохранения ее избежать удержания циклов (т. е. делегаты) - он автоматически обнуляет указатель, когда объект освобождается
  • использовать присвоить для примитивов-точно так же, как слабый, за исключением того, что он не обнуляет объект при освобождении (устанавливается по умолчанию)

(необязательный)

скопировать

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

только для чтения

  • используйте его, чтобы отключить настройку свойства (предотвращает компиляцию кода, если есть нарушение)
  • вы можете изменить то, что доставляется геттером, либо изменив переменную непосредственно через ее переменную экземпляра, либо в самом методе геттера

документ Кланга на цель-C автоматический подсчет ссылок (дуга) четко объясняет квалификаторы и модификаторы владения:

существует четыре квалификатора владения:

  • __autoreleasing
  • __сильный
  • __ * unsafe_unretained*
  • __слабый

тип является нетривиально квалифицированным владельцем, если это так квалифицированный с __autoreleasing,__сильный, или __слабый.

тогда есть шесть модификаторов собственности для объявленной собственности:

  • присвоить подразумевает _ _ *unsafe_unretained* владение.
  • скопировать подразумевает __сильный владение, а также обычное поведение семантики копирования на сеттере.
  • сохранить подразумевает __сильный собственности.
  • сильный подразумевает __сильный собственности.
  • * unsafe_unretained * подразумевает _ _ *unsafe_unretained* владение.
  • слабый подразумевает __слабый собственности.

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

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

задание возникает при вычислении оператора присваивания. Этот семантика варьируется в зависимости от квалификации:

  • для __сильный объекты, новый указатель сначала сохраняется; во-вторых, загружается значение lvalue с примитивной семантикой; в-третьих, новый указатель хранится в lvalue с примитивной семантикой; и, наконец, старый указатель освобождается. Это не выполняется атомарно; внешняя синхронизация должна использоваться, чтобы сделать это безопасным перед лицом параллельных нагрузок и хранилищ.
  • для __слабый объекты, значение lvalue обновляется, чтобы указать на новый объект, если новый объект не является объектом, в котором в настоящее время происходит освобождение, и в этом случае значение lvalue обновляется до a пустой указатель. Это должно выполняться атомарно по отношению к другим назначениям объекту, к чтениям из объекта и к окончательному выпуску нового указателя.
  • для объектов __ * unsafe_unretained* новый указатель хранится в lvalue с использованием примитивной семантики.
  • для __autoreleasing объекты, новые ссылающиеся на заданный сохраняется, autoreleased, и хранится в именующее используя примитивную семантику.

другой разница в чтении, инициализации, разрушении и перемещении, пожалуйста, обратитесь к раздел 4.2 семантика в документе.

сильная:

  • свойство не будет уничтожено, но только после того, как вы установите свойство на ноль, объект будет уничтожен
  • по умолчанию все переменные и локальные переменные являются сильными указатели.
  • вы используете strong только если вам нужно сохранить объект.
  • мы обычно используем strong для UIViewControllers (родители элемента пользовательского интерфейса)
  • IOS 4 (non-ARC) мы можем использовать сохранить Ключевое слово
  • IOS 5 (дуга) мы можем использовать сильный Ключевое слово

пример: @property (strong, nonatomic) ViewController *viewController;

@synthesize viewController;

слабый

по умолчанию автоматически получить и установить в ноль

  • мы обычно используем слабый для IBOutlets (UIViewController ' S Childs) и делегировать
  • то же самое, что назначить, не сохранить или освободить

пример : @собственности (слабый, неатомической) IBOutlet UIButton * myButton;

@synthesize myButton;

различия между сильным и сохранить:

  • в iOS4, сильный равен сохранить
  • это означает, что вы владеете объектом и держите его в куче, пока не укажете на него больше
  • Если ты пишешь сохранить, он будет автоматически работать так же, как сильный

различия между слабыми и назначить:

  • "слабая" ссылка-это ссылка, которую вы не сохраняете, и вы сохраняете ее до тех пор, пока кто-то другой указывает на это сильно
  • когда объект "освобожден", слабый указатель автоматически устанавливается в nil
  • атрибут свойства "assign" сообщает компилятору, как синтезировать реализацию setter свойства

strong, weak, assign атрибуты свойства определяют, как будет управляться память для этого свойства.

сильный означает, что количество ссылок будет увеличено и ссылка на него будет сохраняться в течение всей жизни объекта

слабый ( не сильная ссылка ), означает, что мы указываем на объект, но не увеличивать счетчик ссылок. Он часто используется при создании родительских дочерних отношений. Родитель имеет сильную ссылку на но у ребенка есть только слабая ссылка на родителя.

каждый раз используется на var.
Каждый раз используется на необязательном типе.
Автоматически изменяет себя на ноль.

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

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

Comments

    Ничего не найдено.