Objective-C中属性设置属性的弱点和强大
Objective-C中弱和强属性setter属性之间有什么区别?
@property(retain, [weak/strong]) __attribute__((NSObject)) CFDictionaryRef myDictionary;
什么是影响和利益?
我听说iOS 4不具备弱点,我们需要使用assign。
弱分配类似吗?
您要么打开或closures特定文件的ARC。 如果它不能使用retain
release
autorelease
等…相反,你使用weak
的属性或__strong
__weak
的variables(默认为__strong
)。 坚强是相当于保留,但ARC将为您pipe理释放。
如果你想避免保留周期(例如,父母保留孩子,孩子保留父母,所以永远不会被释放)。
“免费桥接”部分(从NS
到CF
)是有点棘手。 您仍然需要为CF对象手动pipe理CFRelease()
和CFRetain()
。 当你将它们转换回NS对象时,你必须告诉编译器关于保留计数,所以它知道你做了什么。
它在这里 。
这里是关于variables属性的信息
- primefaces//默认
- 非primefaces
- 强=保留/ /默认
- 弱
- 保留
- 分配//默认
- unsafe_unretained
- 复制
- 只读
- 读写//默认
所以下面是详细的文章链接,你可以在上面find所有的属性,这将有力地帮助你。 非常感谢所有在这里给出最佳答案的人!
iOS中的variables属性或修饰符
01. 强(iOS4 =保留) – 它说“把它放在堆里,直到我不再指向它” – 换句话说“我是业主,你不能在释放之前释放这个“ – 只有当你需要保留这个对象的时候才使用强壮。 – 默认情况下,所有实例variables和局部variables都是强指针。 – 我们通常使用强大的UIViewControllers(UI项目的父母) – 强与ARC使用,它基本上帮助你,不必担心对象的保留计数。 ARC完成后会自动为您发布。使用关键字strong意味着您拥有该对象。
例:
@property (strong, nonatomic) ViewController *viewController; @synthesize viewController;
02. weak(iOS4 = unsafe_unretained) – 它说“只要别人强烈地指向它就保留这个” – 与assign,no retain或release一样 – 一个“weak”引用是你不保留的引用。 – 我们通常对IBOutlets(UIViewController的Childs)使用weak。这是可行的,因为只要父对象有效,子对象只需要存在。 – 弱引用是一个引用,它不保护引用的对象不被垃圾收集器收集。 – 弱是本质上分配,一个不变的财产。 除了释放对象的时候,弱指针自动设置为零
例如:
@property (weak, nonatomic) IBOutlet UIButton *myButton; @synthesize myButton;
解释 : 感谢BJ荷马
想象一下,我们的目标是一只狗,而狗想逃跑(被释放)。 强壮的指针就像狗狗上的皮带。 只要你有狗的皮带,狗不会逃跑。 如果五个人把他们的皮带绑在一只狗身上(五个指向一个物体的强指针),那么在所有五个皮带脱离之前,狗不会跑掉。 另一方面,弱指针就像小孩子指着狗说:“看!一条狗!” 只要狗仍然在拴住,小孩们仍然可以看到狗,他们仍然指向它。 然而,只要所有的皮带都分离了,不pipe有多less小孩指着它,狗都会跑掉。 只要最后一个强指针(皮带)不再指向一个对象,对象将被释放,所有弱指针将被清零。 当我们使用弱? 如果你想避免保留周期(例如,父母保留孩子,孩子保留父母,所以永远不会被释放)。
罗伯特引用的文档中明确回答你最后两个问题的部分:
// 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创build不弱化引用的弱引用,但正如名称所暗示的,通常不build议这样做。
另外在文档中:
Weak references are not supported in Mac OS X v10.6 and iOS 4.
晶莹剔透的使用WEAK属性如下:
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类
//Ah #import <Foundation/Foundation.h> #import "Bh" @interface A : NSObject @property (nonatomic, strong) B *objB; @end @implementation A // @end //Bh #import <Foundation/Foundation.h> #import "Ah" @interface B : NSObject @property strong text(nonatomic, strong) A *objA; @end @implementation B // @end and in main #import "Bh" #import "Ah" { A *obja =[[A alloc]init]; B *objb =[[B alloc]init]; A.objB=objb; B.objA=obja; }
上面的代码会产生一个保留周期,因为两者都是强typesa ——–> b ———> a
所以为了避免它,你必须使用它的一个周属性,以便它每周引用该对象,而不是增加引用计数。