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...