Objective-C中的弱属性设置器属性和强属性设置器属性


Answers:


102

您可以打开或关闭特定文件的ARC。如果启用,则不能使用retain release autoreleaseetc ...,而是strong weak用于属性或__strong __weak 变量(默认为__strong)。强等于保留,但是ARC将为您管理发行。

您唯一想使用弱函数的情况是,如果您想避免保留周期(例如,父母保留了孩子,孩子保留了父母,因此都不会被释放)。

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

全部在这里


119

这是我对变量属性了解的信息

  1. 原子//默认
  2. 非原子的
  3. strong =保留//默认
  4. 保留
  5. 分配//默认
  6. unsafe_unretained
  7. 复制
  8. 只读
  9. readwrite //默认

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

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

01. 强大(iOS4 =保留) -它说:“将此保留在堆中,直到我不再指向它为止”-换句话说:“我是所有者,您不能在保留与保留相同的目的之前取消分配它“-仅在需要保留对象时才使用Strong。-默认情况下,所有实例变量和局部变量都是强指针。-我们通常对UIViewControllers(UI项目的父项)使用Strong函数-与ARC一起使用Strong函数,它基本上可以帮助您,而不必担心对象的保留计数。完成后,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;

说明感谢BJ Homer

想象我们的对象是一只狗,那只狗想逃跑(被释放)。强壮的指针就像拴在狗身上。只要您将皮带拴在狗上,狗就不会跑开。如果有五个人将皮带拴在一只狗上(五个强力指针指向一个物体),则只有将所有五个皮带分开后,狗才会逃跑。另一方面,弱指针就像小孩指着狗说:“看!狗!” 只要狗仍系在皮带上,小孩子仍然可以看到狗,他们仍会指向它。但是,一旦所有的皮带都松开了,无论有多少小孩指向它,狗都会跑开。一旦最后一个强指针(皮带)不再指向对象,该对象将被释放,所有弱指针将被清零。什么时候用弱?您唯一想使用弱函数的情况是,如果您想避免保留周期(例如,父母保留了孩子,而孩子保留了父母,因此都不会被释放)。


1
在初始列表中,我不太确定“默认”是什么意思。您同时具有strong=retainassign标记为默认值,但不能两者兼有。
斯利普D.汤普森

27
喜欢皮带牵引的狗。很好地解释它。
Jarrett Barnett

1
很好的解释,尽管iOS不使用垃圾收集。ARC!=垃圾收集(!),这些是不同的技术。

1
弱和unsafe_unretained是不同的(第一个使用归零弱引用,而后者确实蹲下)
wcochran

1
我只是在学习iOS,但是似乎您在示例中放错了weakstrong。父级对子级的strong引用(如您所展示myButtonUIViewController类的属性weak)以及子级weak对父级的引用(如viewController您的子级的属性)更有意义吗? ve改为设置为strong)。例如,阅读马特·诺伊伯格(Matt Neuburg)的著作,iOS 7 Programming Fundamentals他表明,一个将其委托人声明为财产的类会使它保持“弱”,这似乎很公平。
Bogdan Alexandru

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.

1
是的,这是正确的, __unsafe_unretained是的ARC版本assign
罗伯特

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;

1
使用我的属性的弱点,我得到一个警告说:“弱接收者可能会意外地设置为nil”。我看过其他一些文章,为了防止出现此警告,您必须创建本地的强引用。如果这是事实,那么如果最后我必须创建一个强引用,那么使属性变弱的意义何在?
2015年

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;
   }

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

因此,为避免这种情况,您必须使用其中之一的week属性,以便它每周引用该对象而不增加其引用计数。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.