OC大話ARC與物件的生命週期

2021-10-10 21:42:24 字數 1094 閱讀 2122

函式在返回值得時候, 會將其內部變數全部清空釋放;

由alloc/new/copu/mutablecopy方法返回值取得的物件自己持有, 物件預設修飾符為__strong;

除了2中所生成的物件, 其他都是非自己生成但是自己持有的物件;

物件在沒有明確指定修飾符時, 預設為__strong;

-(void)test 

}

函式呼叫時, 生成變數obj1, 指向生成的nsobject物件, 預設修飾符為__strong, 將obj1加入引用計數表中, 當函式呼叫結束, 將要釋放變數obj1時, 內部會先呼叫release, 釋放obj1指向的物件, 這是判斷計數為0, 釋放該物件, 釋放變數obj1;  //此處如果實在mrc環境下, 變數obj1被正確釋放, 但是obj1指向的物件並沒有被釋放, 引起記憶體洩漏;

函式呼叫時, 生成變數obj2, 指向生成的nsmutablearray物件, obj2物件非自己生成, 自己持有的物件, 會被編譯器加入到最近一次建立的自動釋放吃autoreleasepool(pool)中, 並會在當前的runloop迭代結束時釋放, 當函式呼叫完畢, 變數obj2被釋放, obj2指向的物件, 並不會立馬釋放, 釋放時間取決於pool什麼時候被釋放;

obj3物件也是伴隨著函式被呼叫而建立, 被__autoreleasing修飾符修飾, 會被加入到autoreleasepool中, 和obj2物件的情況相同;

obj4物件雖然也是被__autoreleasing修飾, 但是物件本身就是非自己建立, 而持有的物件, 會在array方法返回的時候, 被編譯器加入到最近建立的pool中, 這裡是加入到系統建立的pool中, 和obj2相同;

與物件obj1情況相同;

obj6物件在生成由array返回的時候, 會被編譯器加入到最近建立的pool中, 此時為自己建立的乙個pool中, 該pool的生命週期為到下大括號結束, 釋放pool,  pool中的物件也會被釋放, 

執行到pool的下大括號時, pool生命結束, pool中的所有物件被釋放, 此時變數obj6並未被釋放, 只有函式返回值得時候, 變數obj6被釋放;

obj7物件與obj6物件相同;

obj8物件與obj6物件相同;

物件的生命週期

全域性物件的引用 雖然在c 不允許,但是cil的確允許分配全域性物件 靜態物件 靜態欄位的引用 應用程式的 庫的區域性物件的引用 傳遞進乙個方法的物件引數的引用 等待被終結的物件的引用 任何引用物件的cpu暫存器 要尋找不可達的物件,如果clr逐個檢查託管堆的沒乙個物件,很明顯,效率很低。每個物件都...

java 物件的生命週期

物件的生命週期 1 區域性變數只會存活在該變數的方法中 life 只能在該方法內部使用 scope public void test 2 例項變數的壽命與物件相同。如果物件還活著,例項變數也是會活的 有三種方法可以釋放物件的引用 1 引用永久性的離開他的範圍 public void test a 會...

c 物件的生命週期

c 的new 運運算元和c 的malloc 函式都是為了配置記憶體,但前者比之後者的優點 是,new 不但配置物件所需的記憶體空間時,同時會引發構造式的執行。所謂構造式 constructor 就是物件誕生後第乙個執行 並且是自動執行 的函式,它 的函式名稱必定要與類別名稱相同。相對於構造式,自然就...