关于iphone:Objective-C中的弱和强属性setter属性

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;

    解释:感谢比霍默

    想象一下我们的目标是一只狗,而这只狗想逃跑(被释放)。有力的指针就像狗身上的皮带。只要你把皮带系在狗身上,狗就不会跑掉。如果五个人把他们的皮带系在一只狗上(五个有力的指针指向一个物体),那么这只狗不会逃跑,直到五条皮带都被解开。另一方面,弱指针就像小孩子指着狗说"看!狗!"只要狗还系着皮带,孩子们仍然能看到狗,他们还会指着它。不过,只要所有的皮带都断开,狗就会跑开,不管有多少小孩指着它。一旦最后一个强指针(皮带)不再指向某个对象,该对象将被释放,所有弱指针都将归零。当我们使用弱者?唯一一次你想使用弱的,是如果你想避免保留周期(例如,父母保留了孩子,而孩子保留了父母,所以两人都没有被释放)。


    您可以打开或关闭特定文件的弧。如果你不能使用retainreleaseautorelease等…相反,您使用strongweak作为属性,或使用__strong
    __weak
    作为变量(默认为__strong)。STRONG相当于RETAIN,但是ARC将为您管理发行版。

    唯一一次你想要使用弱的,是如果你想要避免保留周期(例如,父保留子,子保留父,所以两者都不会被释放)。

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

    都在这里。


    弱电性的晶莹用法如下:

    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属性,以便它每周引用对象而不是增加它的引用计数。