內存管理的思考方式
<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中,貌似可以訪問 但對象一經釋放絕對不可訪問 */ [obj release];
</pre>
如此,用alloc方法由自己生成并持有的對象就通過release方法釋放了.自己生成而非自己所持有的對象,用retain持有,同樣可以release釋放.
用某個方法生成對象,并將其返回給該方法的調用方
<pre>-(id)allocObject { //自己生成并持有對象 id obj = [NSObject alloc]init; //自己持有對象 return obj; }
</pre>
那么調用NSMutableArray array
方法取得對象存在,自己不持有對象,又是如何實現的呢?
<pre>-(id)object { id obj = [NSObject alloc]init; [obj autorelease] //取得的對象存在,但自己不持有對象 return obj; }
</pre>
<strong>上例中,使用了autolease方法,可以使取得的對象存在,自己不持有對象.autolease提供這樣的功能,使對象在超出指定生存范圍時能自動正確的釋放</strong>使用NSMutableArray類的array方法獲取誰都不持有的對象,這類方法都是通過autolease而實現的.
<pre>`
id obj1= [obj0 object];
[obj1 retain];
`</pre>
無法釋放非自己持有的對象
崩潰1 :取得的對象存在,自己不持有對象
<pre>id obj1= [obj0 object]; [obj1 release]; //釋放了非自己持有的對象!程序崩潰
</pre>