Objective-C中弱属性设置器属性和强属性设置器属性之间有什么区别?
@property(retain, [weak/strong]) __attribute__((NSObject)) CFDictionaryRef myDictionary;
有什么影响和好处?
我听说弱在iOS 4上不可用,我们需要使用Assign。
弱相配吗?
Answers:
您可以打开或关闭特定文件的ARC。如果启用,则不能使用retain
release
autorelease
etc ...,而是strong
weak
用于属性或__strong
__weak
变量(默认为__strong
)。强等于保留,但是ARC将为您管理发行。
您唯一想使用弱函数的情况是,如果您想避免保留周期(例如,父母保留了孩子,孩子保留了父母,因此都不会被释放)。
“免费桥接”部分(从广播NS
到CF
)有些棘手。您仍然需要手动管理CFRelease()
和CFRetain()
对CF的对象。当您将它们转换回NS对象时,必须告诉编译器保留计数,以便它知道您做了什么。
全部在这里。
这是我对变量属性了解的信息
因此,下面是详细的文章链接,您可以在其中找到上面提到的所有属性,这些都会对您有帮助。非常感谢在这里给出最佳答案的所有人!!
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
想象我们的对象是一只狗,那只狗想逃跑(被释放)。强壮的指针就像拴在狗身上。只要您将皮带拴在狗上,狗就不会跑开。如果有五个人将皮带拴在一只狗上(五个强力指针指向一个物体),则只有将所有五个皮带分开后,狗才会逃跑。另一方面,弱指针就像小孩指着狗说:“看!狗!” 只要狗仍系在皮带上,小孩子仍然可以看到狗,他们仍会指向它。但是,一旦所有的皮带都松开了,无论有多少小孩指向它,狗都会跑开。一旦最后一个强指针(皮带)不再指向对象,该对象将被释放,所有弱指针将被清零。什么时候用弱?您唯一想使用弱函数的情况是,如果您想避免保留周期(例如,父母保留了孩子,而孩子保留了父母,因此都不会被释放)。
strong=retain
和assign
标记为默认值,但不能两者兼有。
weak
和strong
。父级对子级的strong
引用(如您所展示myButton
的UIViewController
类的属性weak
)以及子级weak
对父级的引用(如viewController
您的子级的属性)更有意义吗? ve改为设置为strong
)。例如,阅读马特·诺伊伯格(Matt Neuburg)的著作,iOS 7 Programming Fundamentals
他表明,一个将其委托人声明为财产的类会使它保持“弱”,这似乎很公平。
要调出罗伯特引用的文档中明确回答您最后两个问题的部分:
// 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.
__unsafe_unretained
是的ARC版本assign
。
清晰地使用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;
让我们举一个例子来详细说明(上面的答案已经很好了),也许这个例子会有所帮助
让我们有两个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属性,以便它每周引用该对象而不增加其引用计数。