ios開發 記憶體管理 理解

2021-07-02 14:10:30 字數 2564 閱讀 2171

retaincount是引用計數的意思。

使用release使retaincount-1,使用retain使retaincount+1,當retaincount等於0的時候,該物件會被釋放掉。

非arc記憶體管理:

(1)如果呼叫了alloc\new\copy產生了乙個新物件,最後肯定要呼叫一次release或者autorelease。

(2)如果讓乙個物件做了retain操作(計數器+1),最後肯定要呼叫一次release或者autorelease。

(3)記憶體管理原則是有加有減。

在記憶體管理時會碰到下面的幾個問題:

(1)野指標

可將物件賦值為nil,可以避免野指標的出現。

[p release]; 

p = nil; 

p.age = 30;//相當於 [nil setage:30],這樣就不會造成野指標,如果不加第二行**,會造成野指標。

(2)記憶體洩露

不被使用的物件,一直在記憶體中沒有被銷毀。會造成記憶體洩露

[p retain];  //retaincount=2

[p retain];  //retaincount=3

[p release]; //retaincount=2

上面三行****會導致記憶體洩露,因為p物件沒有完全釋放,他的retaincount不等於零。

p = nil;

[p release];   //此行**相當於[nil release],但是他並沒有讓retaincount 進行-1的操作

(3)set方法的記憶體管理寫法

-  (void) setcar: (car *) car

if ( _car != car)

接下來是autoreleasepool,也就是自動釋放池:

物件存入到自動釋放池中,當這個池子被銷毀時,會對池中的物件進行一次release操作,

在乙個專案中會有乙個預設的autoreleasepool,在專案檔案main.m裡面,實際上他是乙個死迴圈。一直到程式終止才被銷毀。

intmain(

intargc,

char

* argv) }

需要注意的是:

(1) 只有在autoreleasepool作用域中,呼叫autorelease方法,才能將物件新增到自動釋放池中。

@autoreleasepool

(2)函式返回值,不能直接用release,如果直接用release可能會造成野指標的錯誤,這時候可以選擇使用autorelease。

(3)系統物件本身都是autorelease,不能用對齊使用release。例如不能 : nsstring *str = @"str";[str release];

接下來是集合手動管理記憶體的方法:

(1)當物件新增進陣列的時候,會retain一次。

[array addobject:p];

(2)當物件刪除的時候,會release一次。

[arrat removeobject:p]

(3)當陣列release的時候,會release一次。

block的記憶體管理:

block記憶體管理預設是在棧中,開發人員不需要去管理block記憶體

dog *d = [[dog alloc]init];

void

(^myblock)() = ^ ;

myblock();

block_copy

(myblock);

//block_release

(myblock);

在上面的block_copy

(myblock)這一句,對block進行了copy操作 ,block的記憶體會搬到堆裡面,dog的retaincount會加1,

block_release

(myblock)這一句雖然會把block進行一次release操作,但是dog的retaincount仍然是2.

在這裡可以通過[ d  retaincount]檢視dog的retaincount到底有多少。

為了解決這個問題,在非arc情況下,可以在定義dog的時候,加上__block,在arc情況下,可以加上__weak或者__unsafe_unretained解決這個問題。

__block dog *d = [[dog alloc]init];

__weak dog *d = [[dog alloc]init];

__unsafe_unretained dog *d = [[dog alloc]init];

還有就是如果乙個物件擁有乙個block,是不能用assign引數,因為這樣block在棧裡面,不能確保block會存在,只能用copy,這樣就把block放到堆裡面,

需要注意的是如果此時實在非arc情況下,需要在dealloc方法裡面,使用block_release

(myblock)進行一次release操作。

除此之外是集合在arc下的記憶體分析:

(1)當乙個物件被存入集合的時候,預設是儲存強指標

(2)array = nil;//陣列被銷毀

(3)[array removeobject:p]; --------> p=nil; ------------>p被銷毀

c c 記憶體管理理解

說明 1.棧又叫堆疊,非靜態區域性變數 函式引數 返回值等等,棧是向下增長的。2.記憶體對映段是高效的i o對映方式,用於裝載乙個共享的動態記憶體庫。使用者可使用系統介面建立共享共享記憶體,做程序間通訊。3.堆用於程式執行時動態記憶體分配,堆是可以上增長的。4.資料段 儲存全域性資料和靜態資料。5....

Spring事物管理理解

資料庫事務 database transaction 是指作為單個邏輯工作單元執行的一系列操作,要麼完整地執行,要麼完全地不執行。事務處理可以確保除非事務性單元內的所有操作都成功完成,否則不會永久更新面向資料的資源。通過將一組相關操作組合為乙個要麼全部成功要麼全部失敗的單元,可以簡化錯誤恢復並使 應...

ios開發記憶體管理要點

一 使用nsmutablearray例項時的三個記憶體管理要點 1.物件加入nsmutablearray例項時,物件會收到retain訊息 陣列物件會成為該物件的擁有方,並得到乙個指向該物件的指標。2.物件從nsmutablearray例項移出時,會收到release訊息 陣列物件會放棄該物件的所有...