簡體   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