Objective c 迴圈引用

2021-07-05 02:37:33 字數 2642 閱讀 8413

objective-c 迴圈引用

oc記憶體管理中有一種特殊的物件管理,那就是迴圈引用。迴圈引用即是類a中有類b作為成員變數,同時類b中又同時有類a作為成員變數。這種情況下,引用計數器需要特殊的處理。下面分別介紹非arc情況下的迴圈引用和arc情況下的迴圈引用。

一、非arc情況下的迴圈引用,person類中包含card類,card類中包含person類。

1、person類中對card類進行retain ,所以需要進行release。

#import @class card;//因為需要用到,所以宣告

@inte***ce person : nsobject

//屬性是乙個card類, 物件被引用,所以用retain

@property (nonatomic,retain)card *card;

@end

#import "person.h"

#import "card.h"//.m中需要知道card類的具體實現

@implementation person

- (void)dealloc

@end

2、card類中,為了person物件的retaincount 不改變,所以使用assign 進行直接賦值

#import @class person;

@inte***ce card : nsobject

// 使用assign,是person物件的retaincount不 +1

@property (nonatomic,assign)person *person;

@end

#import "card.h"

@implementation card

- (void)dealloc

@end

3、main函式中,寫清楚了 每乙個物件的retaincount的變化:

#import #import "person.h"

#import "card.h"

int main(int argc, const char * argv)

return 0;

}

小結:在非arc中,兩個類之間進行迴圈引用,應該一端 使用retain,另一端使用 assign。因為,計數器只要實現一端引用是+1,另一端中不需要+1 ,所以使用assign 。

二、arc情況下的迴圈引用

為了便於對比,還是使用 person類和card類的迴圈引用

1、person類中對card類指標定義為strong指標 

#import @class card;

@inte***ce person : nsobject

@property (nonatomic,strong)card *card;

@end

#import "person.h"

#import "card.h"

@implementation person

- (void)dealloc

@end

2、c

ard類中,為了保持指向person物件的strong指標數量不變,所以使用weak

#import @class person;

@inte***ce card : nsobject

@property (nonatomic,weak)person *person;

@end

#import "card.h"

@implementation card

- (void)dealloc

@end

3、main函式中,寫清楚了 每乙個物件的strong指標數量的變化:

#import #import "person.h"

#import "card.h"

int main(int argc, const char * argv)

//自動釋放池,結束會向p和c 各自傳送一條 release訊息

// 最後相當於手動管理中物件的retaincount都會變為0;

return 0;

}

小結:

在arc中,兩個類之間進行迴圈引用,應該一端 使用strong,另一端使用 weak。因為,在arc條件下,系統判斷物件是否銷毀的標準是:指向物件空間的strong指標的總數是否為0 ,如果歸零,代表物件已經銷毀。 物件是否銷毀與 weak指標沒有任何關係。如果,weak指標指向的物件空間銷毀了,系統會自動是 weak指標歸nil 。

說到底,arc情況下的 物件擁有的strong指標的個數 等價於 非arc情況下的 retaincount。只要記住這一條,兩者就很容易辨別了。

下面附上記憶體圖,便於理解,實線代表強指標,虛線代表弱指標。

Objective C中block迴圈引用問題詳解

目標 block執行過程中,self不會釋放 執行完可以釋放。最初block中直接使用self會強引用。self.myblock 或者使用了物件的屬性 self.myblock 程式設計客棧 在這樣的情況下,self強引用block,block也持有該物件,導致迴圈引用。要注意的是,只有在self強...

Objective C中的弱引用

inte ce classa nsobject porperty nonatomic,weak classa tempclass1 property nonatomic,strong classa tempclass2 void test end implement classa void test...

迴圈引用問題

main.m 07 迴圈引用 created by kevin on 13 8 9.1.class的作用 僅僅告訴編譯器,某個名稱是乙個類 class person 僅僅告訴編譯器,person是乙個類 2.開發中引用乙個類的規範 1 在.h檔案中用 class來宣告類 2 在.m檔案中用 impo...