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訊息 陣列物件會放棄該物件的所有...