對象的生命週期以下:函數
一、生成並本身持有對象 引用計數+1 code
使用alloc、new、copy、mutableCopy名稱開頭的方法,意味着本身生成的對象本身也持有。orm
但不是絕對的,以下對象
NSObject *object= [NSObject new];//retainCount=1 NSArray *object= [NSArray new];//retainCount=-1
二、持有對象(retain) 引用計數+1生命週期
三、釋放對象(release) 引用計數-1it
四、廢棄對象 (alloc)table
上面的描述用代碼表示就清楚了,以下:test
NSObject*object = [NSObject new];//1 [object retain];//2 NSLog(@"%d ", object.retainCount); [object release];//1 NSLog(@"%d ", object.retainCount); [object release];// 0 //[object release];
對象持有引用計數+1,釋放引用計數-1,當引用計數=0時,對象釋放。貌似很簡單,一兩句話就能夠歸納清楚。可是當多個實體擁有某個對象時,對象的全部權就變得複雜了。object
- (NSString*)myString { NSString *str = [[NSString alloc] initWithFormat:@"test"]; [str retain]; return str; }
像這種狀況,究竟誰釋放?
若是在myString裏面釋放。那麼myString函數外面就無法使用對象了,由於已經被釋放了。
那如何是函數外面釋放,意味着調用者要負責處理。這樣一來,有點不方便。
因此這時候應該用自動釋放(autorelease)來釋放對象:引用
- (NSString*)myString { NSString *str = [[NSString alloc] initWithFormat:@"test"]; [str autorelease]; return str; }