[英]Weak and strong property setter attributes in Objective-C
Objective-C 中的弱屬性設置器屬性和強屬性設置器屬性有什么區別?
@property(retain, [weak/strong]) __attribute__((NSObject)) CFDictionaryRef myDictionary;
有什么影響和好處?
我聽說弱在 iOS 4 上不可用,我們需要使用分配。
弱類似於分配嗎?
這是我對可變屬性的了解
所以下面是詳細的文章鏈接,您可以在其中找到上述所有屬性,這肯定會對您有所幫助。 非常感謝所有在這里給出最佳答案的人!!
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 會為您管理發布。
您唯一想要使用弱的情況是,如果您想避免保留循環(例如,父項保留子項而子項保留父項,因此兩者都不會被釋放)。
“免費橋接”部分(從NS
到CF
)有點棘手。 您仍然需要手動管理 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.