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理释放。

如果你想避免保留周期(例如,父母保留孩子,孩子保留父母,所以永远不会被释放)。

“免费桥接”部分(从NSCF )是有点棘手。 您仍然需要为CF对象手动pipe理CFRelease()CFRetain() 。 当你将它们转换回NS对象时,你必须告诉编译器关于保留计数,所以它知道你做了什么。

它在这里 。

这里是关于variables属性的信息

  1. primefaces//默认
  2. 非primefaces
  3. 强=保留/ /默认
  4. 保留
  5. 分配//默认
  6. unsafe_unretained
  7. 复制
  8. 只读
  9. 读写//默认

所以下面是详细的文章链接,你可以在上面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

所以为了避免它,你必须使用它的一个周属性,以便它每周引用该对象,而不是增加引用计数。