內存管理的思考方式

內存管理的思考方式

<ul>
<li>自己生成的對象,自己持有</li>
<li>非自己生成的對象,自己也能持有</li>
<li>不在需要自己持有的對象時釋放</li>
<li>非自己持有的對象無法釋放</li>
</ul>

生成持有對象:alloc/new/copy/mutableCopy方法
持有對象:retain方法
釋放對象:release方法
廢棄對象:dealloc方法

這些有關OC的內存管理方法,實際上包含在Cocoa框架中.Cocoa框架類庫的NSObject類負擔內存管理的職責.

自己生成的對象,自己持有

alloc.new.copy.mutableCopy,allocMyObject.newThatObject.copyThis.mutableCopyYourObject

非自己生成的對象,自己也能持有

下面以NSMutableArray的array方法說明:

<pre>//獲得非自己生成并持有的對象 id obj = [NSMutableArray array]; //取得對象存在,但自己不持有對象,使用retain方法可以持有對象. [obj retain];</pre>

不需要自己持有的對象時釋放

自己持有的對象,一旦不需要,持有者有義務釋放該對象.釋放使用release方法

<pre>//獲得非自己生成并持有的對象 id obj = [NSMutableArray array]; //自己持有對象 [obj retain]; /* 釋放對象 指向對象的指針仍然保留在變量obj中,貌似可以訪問 但對象一經(jīng)釋放絕對不可訪問 */ [obj release];</pre>

如此,用alloc方法由自己生成并持有的對象就通過release方法釋放了.自己生成而非自己所持有的對象,用retain持有,同樣可以release釋放.

用某個方法生成對象,并將其返回給該方法的調用方

<pre>-(id)allocObject { //自己生成并持有對象 id obj = [NSObject alloc]init; //自己持有對象 return obj; }</pre>

那么調用NSMutableArray array 方法取得對象存在,自己不持有對象,又是如何實現(xiàn)的呢?

<pre>-(id)object { id obj = [NSObject alloc]init; [obj autorelease] //取得的對象存在,但自己不持有對象 return obj; }</pre>

<strong>上例中,使用了autolease方法,可以使取得的對象存在,自己不持有對象.autolease提供這樣的功能,使對象在超出指定生存范圍時能自動正確的釋放</strong>使用NSMutableArray類的array方法獲取誰都不持有的對象,這類方法都是通過autolease而實現(xiàn)的.

<pre>`
id obj1= [obj0 object];
[obj1 retain];

`</pre>

無法釋放非自己持有的對象

崩潰1 :取得的對象存在,自己不持有對象

<pre>id obj1= [obj0 object]; [obj1 release]; //釋放了非自己持有的對象!程序崩潰</pre>

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容