對象操作的四個類別
對象操作 | OC中對應的方法 | 對應的 retainCount 變化 |
---|---|---|
生成并持有對象 | alloc/new/copy/mutableCopy等 | +1 |
持有對象 | retain | +1 |
釋放對象 | release | -1 |
廢棄對象 | dealloc | - |
注意:
-
這些對象操作的方法其實并不包括在OC中,而是包含在Cocoa框架下的Foundation框架中。從 iOS 7 開始,這些方法被移動到了 Runtime 當中右遭,可以在 objc4-680 NSObject.h 找到。 - 對象的
reatinCount
屬性并沒有實際上的參考價值缤削,參考蘋果官方文檔《Practical Memory Management》.
四個法則
- 自己生成的對象窘哈,自己持有。
- 非自己生成的對象亭敢,自己也能持有滚婉。
- 不在需要自己持有對象的時候,釋放帅刀。
- 非自己持有的對象無需釋放让腹。
如下是四個黃金法則對應的代碼示例:
/*
* 自己生成并持有該對象
*/
id obj0 = [[NSObeject alloc] init];
id obj1 = [NSObeject new];
/*
* 持有非自己生成的對象
*/
id obj = [NSArray array]; // 非自己生成的對象远剩,且該對象存在,但自己不持有
[obj retain]; // 自己持有對象
/*
* 不在需要自己持有的對象的時候骇窍,釋放
*/
id obj = [[NSObeject alloc] init]; // 此時持有對象
[obj release]; // 釋放對象
/*
* 指向對象的指針仍就被保留在obj這個變量中
* 但對象已經(jīng)釋放瓜晤,不可訪問
*/
/*
* 非自己持有的對象無法釋放
*/
id obj = [NSArray array]; // 非自己生成的對象,且該對象存在腹纳,但自己不持有
[obj release]; // ~~~此時將運行時crash 或編譯器報error~~~ 非 ARC 下痢掠,調用該方法會導致編譯器報 issues。此操作的行為是未定義的嘲恍,可能會導致運行時 crash 或者其它未知行為
autorelease
使得對象在超出生命周期后能正確的被釋放(通過調用release
方法)足画。在調用 release
后,對象會被立即釋放佃牛,而調用 autorelease
后淹辞,對象不會被立即釋放,而是注冊到 autoreleasepool
中吁脱,經(jīng)過一段時間后 pool
結束桑涎,此時調用release
方法,對象被釋放兼贡。
在MRC的內存管理模式下攻冷,與對變量的管理相關的方法有:retain
, release
和 autorelease
。retain
和 release
方法操作的是引用記數(shù)遍希,當引用記數(shù)為零時等曼,便自動釋放內存。并且可以用NSAutoreleasePool
對象凿蒜,對加入自動釋放池(autorelease
調用)的變量進行管理禁谦,當 drain
時回收內存。