Слабые и сильные атрибуты задатчика свойств в Objective-C
в чем разница между слабыми и сильными атрибутами установщика свойств в Objective-C?
@property(retain, [weak/strong]) __attribute__((NSObject)) CFDictionaryRef myDictionary;
что такое влияние и польза?
Я слышал, что слабый не доступен на iOS 4, и нам нужно использовать assign.
слабый похож на назначение?
5 ответов:
у вас есть дуга вкл или выкл для конкретного файла. Если его на вы не можете использовать
retainreleaseautoreleaseetc... Вместо этого вы используетеstrongweakсвойства или__strong__weakдля переменных (по умолчанию:__strong). Strong-это эквивалент сохранения, однако ARC будет управлять выпуском для вас.единственный раз, когда вы хотите использовать слабый, это если вы хотите избежать циклов сохранения (например, родитель сохраняет ребенка, а ребенок сохраняет родителя, поэтому ни один из них когда-либо выпущенный).
часть "бесплатный мост" (литье от
NSдоCF) немного сложнее. Вам все равно придется вручную управлятьCFRelease()иCFRetain()для объектов CF. Когда вы преобразуете их обратно в объекты NS, вы должны сообщить компилятору о количестве сохранений, чтобы он знал, что вы сделали.все здесь.
вот информация, что я знаю о свойствах переменных
- atomic / / default
- неатомической
- strong=сохранить / / default
- слабый
- сохранить
- назначение //по умолчанию
- unsafe_unretained
- скопировать
- только для чтения
- чтение и запись //по умолчанию:
Итак, ниже приведена подробная ссылка на статью, где вы можете найти все вышеперечисленные атрибуты, которые вам демонстративно помогут. Огромное спасибо всем людям, которые дают лучшие ответы здесь!!
01.сильный (iOS4 = сохранить) - он говорит: "Держите это в куче, пока я больше не укажу на него" - другими словами " Я владелец, вы не можете освободить это до цели штраф с тем же, как сохранить" - Вы использовать только если вам нужно сохранить объект. - По умолчанию все переменные экземпляра и локальные переменные являются сильными указателями. - Мы обычно используем strong для UIViewControllers (родители элемента пользовательского интерфейса) - strong используется с ARC , и это в основном помогает вам, не беспокоясь о сохранении количества объектов. ARC автоматически освобождает его для вас, когда вы закончите с ним.С помощью ключевого слова означает, что вы владеете объект.
пример:
@property (strong, nonatomic) ViewController *viewController; @synthesize viewController;02.слабый (iOS4 = unsafe_unretained) - он говорит: "Держите это до тех пор, пока кто-то другой указывает на это сильно" - то же самое, что назначить, не сохранить или освободить - "Слабая" ссылка-это ссылка, которую вы не сохраняете. - Мы обычно используем слабый для IBOutlets (детей UIViewController).Это работает, потому что дочерний объект только должен существовать столько же, сколько и родительский объект. - слабая ссылка-это ссылка, которая не защищает объект ссылки от сбора сборщиком мусора. - Слабый-это, по сути, присвоение, незадекларированное свойство. Кроме того, когда объект освобождается слабый указатель автоматически устанавливается в nil
пример :
@property (weak, nonatomic) IBOutlet UIButton *myButton; @synthesize myButton;объяснить: спасибо BJ Homer
представьте, что наш объект-собака, и что собака хочет убежать (освободиться). Сильные указатели - это как поводок на собаке. Пока у вас есть поводок, прикрепленный к собаке, собака не убежит. Если пять человек прикрепляют свой поводок к одной собаке (пять сильных указателей на один объект), то собака не убежит, пока все пять поводков не будут отсоединены. Слабые указатели, с другой стороны, похожи на маленьких детей, указывающих на собаку и говорящих: "Смотри! Собака!"Пока собака все еще на поводке, маленькие дети все еще могут видеть собаку, и они все еще будут указывать на нее. Однако, как только все поводки будут отсоединены, собака убегает независимо от того, сколько маленьких детей указывают на это. Как только последний сильный указатель (поводок) больше не указывает на объект, объект будет освобожден, а все слабые указатели будут обнулены. Когда мы используем слабых? Единственный раз, когда вы хотите использовать слабый, это если вы хотите избежать сохранения циклов (например, родитель сохраняет ребенка, а ребенок сохраняет родителя, поэтому ни один из них никогда не освобождается).
чтобы вызвать части документов, на которые ссылается Роберт, которые явно отвечают на ваши последние два вопроса:
// The following declaration is similar to "@property(assign) MyClass *myObject;" // except that if the MyClass instance is deallocated, // the property value is set to nil instead of remaining as a dangling pointer. @property(weak) MyClass *myObject;Это называется обнулением слабой ссылки. Вы можете создать слабые ссылки, которые не обнуляют слабые ссылки, используя __unsafe_unretained, но, как следует из названия, это обычно не рекомендуется.
также в документации:
Weak references are not supported in Mac OS X v10.6 and iOS 4.
кристально чистое использование слабого свойства выглядит следующим образом:
Any control whose properties we need to change(eg:text of a label) is declared weak and as below: @property(nonatomic,weak) IBOutlet Type *name; Eg: @property(nonatomic,weak) IBOutlet UILabel *myLabel;
давайте возьмем пример, чтобы разработать больше(выше ответ уже велик), пусть этот пример поможет немного больше
пусть у нас есть два класса A и B
//A.h #import <Foundation/Foundation.h> #import "B.h" @interface A : NSObject @property (nonatomic, strong) B *objB; @end @implementation A // @end //B.h #import <Foundation/Foundation.h> #import "A.h" @interface B : NSObject @property strong text(nonatomic, strong) A *objA; @end @implementation B // @end and in main #import "B.h" #import "A.h" { A *obja =[[A alloc]init]; B *objb =[[B alloc]init]; A.objB=objb; B.objA=obja; }приведенный выше код будет генерировать цикл сохранения, потому что оба являются сильным типом a------ - >b--------->а
поэтому, чтобы избежать этого, вы должны использовать свойство week одного из них, чтобы он еженедельно обращался к объект, а не увеличить его количество ссылок.
Comments