OC 記憶體管理 迴圈引用

2021-10-02 10:12:43 字數 1754 閱讀 9756

儲存消耗空間:ram rom

記憶體模型:cg  arc mrc

記憶體變數:堆 棧  靜態區

迴圈引用在block函式中經常發生舉個例子 建立兩個全域性變數 乙個為block 另乙個是str

@inte***cenextviewcontroller ()

@property(nonatomic,strong) dispatch_block_t block;

@property(nonatomic,copy) nsstring *str;

@end

@implementationnextviewcontroller

- (void)viewdidload {

[superviewdidload];

// do any additional setup after loading the view.

self.title = @"test block";

__weaktypeof(self) weakself =self;

self.block = ^(){

weakself.str = @"222222";

__strongtypeof(self) strongself = weakself;

dispatch_after(dispatch_time(dispatch_time_now, (int64_t)(5*nsec_per_sec)), dispatch_get_main_queue(), ^{

nslog(@"str===%@",strongself.str);

self.block();

- (void)dealloc{

nslog(@"dealloc");

block 函式作用域中引用了self 這會迴圈引用導致記憶體洩露,為了打破迴圈引用我們這裡引入__weaktypeof(self) weakself =self; 將其變數str賦值 但是在block中增加乙個耗時執行緒的操作,這裡就得引入__strongtypeof(self) strongself = weakself;

這樣就可以將str的變數在5秒鐘之後列印出來.分析如下:__strongtypeof(self) strongself = weakself; self 引用計數+1

block 可以捕獲區域性變數,block 是li名函式在函式內宣告的變數 在函式結束後立即** 那麼self 引用計數-1

最後在pop該vc之後就可以呼叫dealloc函式 

OC 026 記憶體管理中迴圈引用的問題

記憶體管理中有乙個迴圈引用的問題出現,雖然 看似沒有任何記憶體問題,但是由於互相引用,而造成了記憶體洩露。沒能正確的 記憶體。所以解決的辦法是在乙個完成的迴圈體內其中乙個物件中,讓其不加入記憶體管理 來破壞相互引用的問題。在迴圈引用中,需要用到 class 來告訴編譯器有這個類,不要再用 impor...

Swift 記憶體管理,迴圈引用

在執行時點選 如果有記憶體洩漏的問題,在左側列表會出現如下 然後點選出問題的會出現如下圖,乙個contact類的物件和乙個number類的物件迴圈引用 allocation 分配記憶體 initialization 初始化 使用deinitialization deallocation 記憶體 可以...

OC 記憶體引用計數 記憶體管理機制

記憶體引用計數 用於管理物件記憶體的 使用次數 注意 是對記憶體的引用計數 只有當記憶體的引用計數為0時,記憶體自動釋放 release 僅僅讓通過指標讓記憶體的引用計數 1 assign 基本資料型別 retain 淺拷貝,但是引用計數會 1 property retain void setp p...