內(nèi)存管理的思考方式
<ul>
<li>自己生成的對象,自己持有</li>
<li>非自己生成的對象,自己也能持有</li>
<li>不在需要自己持有的對象時(shí)釋放</li>
<li>非自己持有的對象無法釋放</li>
</ul>
生成持有對象:alloc/new/copy/mutableCopy方法
持有對象:retain方法
釋放對象:release方法
廢棄對象:dealloc方法
這些有關(guān)OC的內(nèi)存管理方法,實(shí)際上包含在Cocoa框架中.Cocoa框架類庫的NSObject類負(fù)擔(dān)內(nèi)存管理的職責(zé).
自己生成的對象,自己持有
alloc.new.copy.mutableCopy,allocMyObject.newThatObject.copyThis.mutableCopyYourObject
非自己生成的對象,自己也能持有
下面以NSMutableArray的array方法說明:
<pre>//獲得非自己生成并持有的對象 id obj = [NSMutableArray array]; //取得對象存在,但自己不持有對象,使用retain方法可以持有對象. [obj retain];
</pre>
不需要自己持有的對象時(shí)釋放
自己持有的對象,一旦不需要,持有者有義務(wù)釋放該對象.釋放使用release方法
<pre>//獲得非自己生成并持有的對象 id obj = [NSMutableArray array]; //自己持有對象 [obj retain]; /* 釋放對象 指向?qū)ο蟮闹羔樔匀槐A粼谧兞縪bj中,貌似可以訪問 但對象一經(jīng)釋放絕對不可訪問 */ [obj release];
</pre>
如此,用alloc方法由自己生成并持有的對象就通過release方法釋放了.自己生成而非自己所持有的對象,用retain持有,同樣可以release釋放.
用某個(gè)方法生成對象,并將其返回給該方法的調(diào)用方
<pre>-(id)allocObject { //自己生成并持有對象 id obj = [NSObject alloc]init; //自己持有對象 return obj; }
</pre>
那么調(diào)用NSMutableArray array
方法取得對象存在,自己不持有對象,又是如何實(shí)現(xiàn)的呢?
<pre>-(id)object { id obj = [NSObject alloc]init; [obj autorelease] //取得的對象存在,但自己不持有對象 return obj; }
</pre>
<strong>上例中,使用了autolease方法,可以使取得的對象存在,自己不持有對象.autolease提供這樣的功能,使對象在超出指定生存范圍時(shí)能自動正確的釋放</strong>使用NSMutableArray類的array方法獲取誰都不持有的對象,這類方法都是通過autolease而實(shí)現(xiàn)的.
<pre>`
id obj1= [obj0 object];
[obj1 retain];
`</pre>
無法釋放非自己持有的對象
崩潰1 :取得的對象存在,自己不持有對象
<pre>id obj1= [obj0 object]; [obj1 release]; //釋放了非自己持有的對象!程序崩潰
</pre>