繁体   English   中英

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

[英]Weak and strong property setter attributes in Objective-C

Objective-C 中的弱属性设置器属性和强属性设置器属性有什么区别?

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

有什么影响和好处?

我听说弱在 iOS 4 上不可用,我们需要使用分配。

弱类似于分配吗?

这是我对可变属性的了解

  1. 原子 //默认
  2. 非原子的
  3. 强=保留//默认
  4. 虚弱的
  5. 保持
  6. 赋值 //默认
  7. unsafe_unretained
  8. 复制
  9. 只读
  10. 读写 //默认

所以下面是详细的文章链接,您可以在其中找到上述所有属性,这肯定会对您有所帮助。 非常感谢所有在这里给出最佳答案的人!!

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

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

例子:

@property (strong, nonatomic) ViewController *viewController;

@synthesize viewController;

02.弱 (iOS4 = unsafe_unretained ) - 它说“只要其他人强烈地指向它就保持它” - 与赋值相同,没有保留或释放 - “弱”引用是您不保留的引用。 - 我们通常对IBOutlets(UIViewController 的Childs)使用weak。这是因为子对象只需要在父对象存在时就存在。 - 弱引用是不保护被引用对象不被垃圾收集器收集的引用。 - 弱本质上是赋值,一种未保留的属性。 除了对象被释放时,弱指针自动设置为 nil

例子 :

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

@synthesize myButton;

解释:感谢 BJ Homer

想象一下我们的对象是一只狗,而这只狗想要逃跑(被释放)。 强指针就像狗的皮带。 只要你把皮带拴在狗身上,狗就不会逃跑。 如果五个人将他们的皮带系在一只狗上(五个强烈的指针指向一个物体),那么在所有五条皮带都断开之前,狗不会逃跑。 另一方面,弱指针就像小孩子指着狗说“看!一只狗!” 只要狗仍然被拴在皮带上,小孩子仍然可以看到狗,他们仍然会指向它。 然而,一旦所有的皮带都松开了,不管有多少小孩指着它,这只狗都会逃跑。 一旦最后一个强指针(leash)不再指向一个对象,该对象将被释放,所有弱指针将被清零。 当我们使用弱? 您唯一想要使用弱的情况是,如果您想避免保留循环(例如,父项保留子项而子项保留父项,因此两者都不会被释放)。

您可以为特定文件打开或关闭 ARC。 如果它打开,您不能使用retain release autorelease等...相反,您对属性使用strong weak或对变量使用__strong __weak (默认为__strong )。 Strong 相当于保留,但是 ARC 会为您管理发布。

您唯一想要使用弱的情况是,如果您想避免保留循环(例如,父项保留子项而子项保留父项,因此两者都不会被释放)。

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

它的全部在这里

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;

要调用 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.

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

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

上面的代码会产生一个retain循环,因为都是强类型a-------->b--------->a

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM