2013-03-28 65 views
4

我有以下ARC啓用的碼理解弱引用

@property (nonatomic, weak) NSArray *a; 
- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    self.a = @[@1, @2]; 
    NSLog(@"ab is %@", self.a); //prints details of array 
    // Do any additional setup after loading the view, typically from a nib. 
} 
- (void)didReceiveMemoryWarning 
{ 

    [super didReceiveMemoryWarning]; 
    for (id element in self.a) { //empty here 
     NSLog(@"blah"); 
    } 
    // Dispose of any resources that can be recreated. 
} 

這只是我曾經的self.a的地方。這是我寫的一個測試程序,用於調試我的一個問題。

當我模擬內存警告self.a消失?爲什麼?

回答

9

爲了理解這一點,您必須瞭解引用計數。在Objective-C中,每個對象都有一個引用計數(即對該對象的強引用數)。如果沒有強引用,則引用計數爲0,並且對象被釋放。

self.a = @[@1, @2];創建一個自動發佈的NSArray(意味着它將在稍後階段自動發佈)並將其分配給self.a。一旦autoreleasepool耗盡,該數組的引用計數爲0(假設沒有其他強引用),並且它被取消分配。作爲弱變量的self.a被自動設置爲零。

如果您使用[[NSArray alloc] init]初始化陣列並將其分配給弱指針,則該對象將在賦值後立即釋放。在NSLog,a將是nil

__weak NSArray* a = [[NSArray alloc] initWithObjects:@"foo", @"bar", nil]; 
NSLog(@"%@", a); 

在Xcode 4.6中,編譯器會警告你後一種情況。

+5

只是出於教養的考慮:保留計數已被棄用,引用計數就是您所指的。如在,自動**引用計數**。 – CodaFi 2013-03-28 07:06:21

0

弱引用不延伸它指向 到對象的壽命,並自動變爲零

ARC Introduces New Lifetime Qualifiers

其將不受1.確實增加了引用計數不成爲該對象的所有者,但只是提及它。如果對象的引用計數下降到0,即使您可能仍指向此處,它將從內存中釋放。

(nonatomic, copy, strong, weak)

所以在這裏你弱對象時,它將會分配傳入的值給它,而不是保存。由於您無法控制對象的生命週期,因此您正在引用的對象較弱,因此至少存在一個對象,因爲至少有一個對象對它有強烈的引用。一旦不再是這種情況,對象就會被銷燬,而且使用一次後,您的弱財產將自動設置爲零。

+0

你能解釋一下「使用一次後設置爲零」嗎? – wz366 2018-02-16 01:00:45