Weak and strong property setter attributes in Objective-C
在Objective-C中,弱属性设置者和强属性设置者之间有什么区别?
1 | @property(retain, [weak/strong]) __attribute__((NSObject)) CFDictionaryRef myDictionary; |
影响和好处是什么?
我听说iOS 4上没有弱版本,我们需要使用assign。
弱与赋值相似吗?
以下是我所知道的有关变量属性的信息
下面是详细的文章链接,您可以在其中找到上面提到的所有属性,这将对您有很大帮助。非常感谢所有在这里给出最佳答案的人!!
Variable property attributes or Modifiers in iOS
01.STRONG(IOS4=保留)-上面写着"把这个放在堆里,直到我不再指向它"-换言之,"我是所有者,你不能在目标明确之前就把它处理掉,就像保留一样"-只有在需要保留对象时才使用强。-默认情况下,所有实例变量和局部变量都是强指针。-我们通常对uiviewcontrollers(ui项的父项)使用strong-STRONG与ARC一起使用,它基本上可以帮助您不必担心对象的保留计数。完成后,ARC会自动释放它。使用关键字STRONG表示您拥有对象。
例子:
1 2 3 | @property (strong, nonatomic) ViewController *viewController; @synthesize viewController; |
02.弱(ios4=不安全未维护)-上面写着"只要有人强烈地指向它,就保持这个"-与分配相同,不保留或释放-"弱"引用是指不保留的引用。-我们通常对iboutlets(uiviewcontroller的子对象)使用weak,这是因为子对象仅只要父对象存在,就需要存在。-弱引用是不保护被引用对象不被垃圾收集器收集的引用。-弱本质上是分配的,是不包含的属性。除非当对象被释放时,弱指针自动设置为零
例子:
1 2 3 | @property (weak, nonatomic) IBOutlet UIButton *myButton; @synthesize myButton; |
解释:感谢比霍默
想象一下我们的目标是一只狗,而这只狗想逃跑(被释放)。有力的指针就像狗身上的皮带。只要你把皮带系在狗身上,狗就不会跑掉。如果五个人把他们的皮带系在一只狗上(五个有力的指针指向一个物体),那么这只狗不会逃跑,直到五条皮带都被解开。另一方面,弱指针就像小孩子指着狗说"看!狗!"只要狗还系着皮带,孩子们仍然能看到狗,他们还会指着它。不过,只要所有的皮带都断开,狗就会跑开,不管有多少小孩指着它。一旦最后一个强指针(皮带)不再指向某个对象,该对象将被释放,所有弱指针都将归零。当我们使用弱者?唯一一次你想使用弱的,是如果你想避免保留周期(例如,父母保留了孩子,而孩子保留了父母,所以两人都没有被释放)。
您可以打开或关闭特定文件的弧。如果你不能使用
唯一一次你想要使用弱的,是如果你想要避免保留周期(例如,父保留子,子保留父,所以两者都不会被释放)。
"免费桥接"部分(从
都在这里。
弱电性的晶莹用法如下:
1 2 3 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; |
要调出罗伯特引用的文档中明确回答您最后两个问题的部分:
1 2 3 4 | // 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; |
这被称为零弱参考。可以使用"不安全"unretained创建不归零弱引用的弱引用,但顾名思义,通常不建议这样做。
文档中还包括:
1 | Weak references are not supported in Mac OS X v10.6 and iOS 4. |
让我们举个例子来详细说明(上面的答案已经很好了),这个例子能帮上一点忙吗?
我们要两个A和B班的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | //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----->A
为了避免它,您必须使用其中一个的Week属性,以便它每周引用对象而不是增加它的引用计数。