首页 文章

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

提问于
浏览
91

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

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

有什么影响和好处?

我听说iOS 4上没有弱功能,我们需要使用assign .

弱类似于分配?

5 回答

  • 2

    要调出Robert引用的文档中明确回答最后两个问题的部分:

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

    Here is information what I know about variable properties

    • atomic //默认

    • 非原子的

    • strong =保留//默认

    • 保留

    • assign //默认

    • unsafe_unretained

    • 副本

    • 只读

    • readwrite //默认

    以下是详细的文章链接,您可以在其中找到上述所有属性,这些属性将极力帮助您 . 非常感谢所有在这里给出最佳答案的人!

    iOS中的变量属性属性或修饰符

    1. strong (iOS4 = retain ) - 它说"keep this in the heap until I don't point to it anymore" - 换句话说" I'am the owner, you cannot dealloc this before aim fine with that same as retain" - 只有在需要保留对象时才使用强 . - 默认情况下,所有实例变量和局部变量都是强指针 . - 我们通常对UIViewControllers(UI项目的父项)使用strong - 强与ARC一起使用,它基本上可以帮助您,而不必担心对象的保留计数 . 完成后,ARC会自动为您释放它 . 使用关键字strong表示您拥有该对象 .

    例:

    @property (strong, nonatomic) ViewController *viewController;
    
    @synthesize viewController;
    
    1. weak (iOS4 = unsafe_unretained ) - 它说"keep this as long as someone else points to it strongly" - 与分配相同,没有保留或释放 - "weak"引用是您不保留的引用 . - 我们通常对IBOutlets使用weak(UIViewController的Childs) . 这是有效的,因为只要父对象存在,子对象才需要存在 . - 弱引用是一种引用,它不保护引用的对象不被垃圾收集器收集 . - 弱的本质上是分配,一个没有保留的 property . 除了释放对象时,弱指针自动设置为nil

    示例:

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

    ExplainThanks to BJ Homer

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

  • 101

    您可以为特定文件启用或禁用ARC . 如果它在你不能使用 retain release autorelease 等...而是使用 strong weak 作为属性或 __strong __weak 作为变量(默认为 __strong ) . Strong相当于保留,但ARC将为您管理发布 .

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

    'toll free bridging'部分(从 NS 转换为 CF )有点棘手 . 您仍然需要为CF对象手动管理 CFRelease()CFRetain() . 当你将它们转换回NS对象时,你必须告诉编译器有关保留计数的信息,以便它知道你做了什么 .

    全是here .

  • 0

    晶莹剔透地使用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;
    
  • 2

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

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

    上面的代码将生成一个保留周期,因为它们都是强类型--------> b ---------> a

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

相关问题