Objective-C中的弱和强属性setter属性

时间:2011-10-27 06:53:09

标签: iphone ios objective-c automatic-ref-counting

Objective-C中弱属性和强属性setter属性之间有什么区别?

@property(retain, [weak/strong]) __attribute__((NSObject)) CFDictionaryRef myDictionary;

有什么影响和好处?

我听说iOS 4上没有弱点,我们需要使用assign。

弱于类似于?

5 个答案:

答案 0 :(得分:119)

以下是我对变量属性的了解

  1. atomic // default
  2. 非原子
  3. strong = retain // default
  4. 保留
  5. assign // default
  6. unsafe_unretained
  7. 复制
  8. 只读
  9. readwrite // default
  10. 以下是详细的文章链接,您可以在其中找到上述所有属性,这些属性将极力帮助您。 非常感谢所有在这里给出最佳答案的人!!

      

    Variable property attributes or Modifiers in iOS

    01. 强(iOS4 =保留)      - 它说“把它保存在堆中,直到我不再指向它”      - 换句话说“我是拥有者,你不能在保留目标之前解决这个问题”      - 只有在需要保留对象时才使用strong。      - 默认情况下,所有实例变量和局部变量都是强指针。      - 我们通常对UIViewControllers使用strong(UI项目的父项)      - ARC使用强大,它基本上可以帮助您,而不必担心对象的保留计数。完成后,ARC会自动为您释放它。使用关键字strong表示您拥有该对象。

    示例:

    @property (strong, nonatomic) ViewController *viewController;
    
    @synthesize viewController;
    

    02. 弱(iOS4 = unsafe_unretained)      - 它说“只要别人强烈指出它就保持这个”      - 与分配相同,不保留或释放      - “弱”引用是您不保留的引用。      - 我们通常对IBOutlets使用弱(UIViewController的Childs)。这是有效的,因为只有子对象      只要父对象存在,就需要存在。      - 弱引用是一种引用,它不保护引用的对象不被垃圾收集器收集。      - 弱基本上是分配,一个没有保留的财产。除了取消分配对象时,弱指针自动设置为nil

    示例:

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

    <强>解释Thanks to BJ Homer

    想象一下,我们的对象是一只狗,狗想要逃跑(被解除分配)。 强壮的指针就像是狗的皮带。只要你的皮带附着在狗身上,狗就不会逃跑。如果五个人将他们的皮带连接到一只狗,(五个强指针指向一个物体),那么在所有五个皮带脱落之前,狗不会逃跑。 另一方面,弱点就像小孩子指着那只狗说“看!一只狗!”只要狗仍然在皮带上,小孩子仍然可以看到狗,他们仍然会指向它。然而,一旦所有的皮带脱落,无论有多少小孩指着它,狗都会跑开。 一旦最后一个强指针(皮带)不再指向一个对象,该对象将被释放,并且所有弱指针都将被清零。 当我们使用弱者? 你想要使用弱的唯一一次是,如果你想避免保留周期 (例如,父母保留孩子,孩子保留父母,所以两者都没有被释放)。

答案 1 :(得分:101)

您可以为特定文件启用或禁用ARC。如果它在您的身上,则无法使用retain release autorelease等...而是使用strong weak作为属性或__strong {{1}对于变量(默认为__weak )。 Strong相当于保留,但ARC将为您管理发布。

你唯一想要使用弱的方法是,如果你想避免保留周期(例如父母保留孩子而孩子保留父母,所以两者都没有被释放)。

“免费桥接”部分(从__strong投射到NS)有点棘手。您仍然需要为CF对象手动管理CFCFRelease()。当你将它们转换回NS对象时,你必须告诉编译器保留计数,以便它知道你做了什么。

全部为here

答案 2 :(得分:2)

调出罗伯特引用的文档部分,明确回答您的最后两个问题:

// 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.

答案 3 :(得分:2)

明确使用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;

答案 4 :(得分:0)

让我们举一个例子来详细说明(上面的答案已经很好了),这个例子可能会有所帮助

让我们有两个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;
   }

上面的代码将生成一个保留周期,因为两者都是强类型     一个--------&GT,B ---------&gt;一种

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