關於引用計數

Object-c的內存管理是使用引用計數,來監測對象是否還在被使用,當不被使用的時候,釋放內存。 objective-c

關於引用計數retaincount,當使用alloc方法進行內存分配建立對象時,對象就有了一個引用計數,並且retaincount=1。以後,正在運行的應用程序能夠在多個位置引用該對象,或者對象可能存儲在一個數組中,也可能被其餘位置的實例變量引用,只有在肯定使用該對象的每一個人都使用完後,才能釋放它所佔用的內存。每一次使用該對象,好比添加到數組中,使其引用計數加1;或者也能夠手動保持該對象,就是本身調用ratain消息,[myObject retain]。不須要對象時,發動release消息,使對象引用計數減1。當對象的引用次數達到0時,系統指導再也不須要這個對象(由於理論上它再也不被引用),所以系統就會釋放它的內存。 數組

代碼示例: spa

#import <Foundation/NSObject.h> 設計

#import <Foundation/NSAutoreleasePool.h> 指針

#import <Foundation/NSString.h> orm

#import <Foundation/NSArray.h> 對象

#import <Foundation/NSValue.h> 內存

Int main(int argc,char *argv[]) rem

{ 文檔

NSAutoreleasePool *pool=[[NSAutorelease alloc]init];

NSNumber *myInt=[NSNumber numberWithInteger:100];

NSNumber *myInt2;

NSMutableArray *myArr=[NSMutableArray array];

NSLog(@myInt retain count=%lx,(unsigned long)[myInt retainCount]);

//調用retainCount返回的是一個NSUInteger類型的無符號整數

[myArr addObject:myInt];

NSLog(@after adding to array=%lx,(unsigned long)[myInt retainCount]);

myInt2=myInt;

NSLog(@after asssignment to myInt2=%lx,(unsigned long)[myInt retainCount]);

[myInt retain];

NSLog(@myInt after retain=%lx,(unsigned long)[myInt retainCount]);

NSLog(@myInt2 after retain=%lx,(unsigned long)[myInt2 retainCount]);

[myInt release];

NSLog(@after release=%lx,(unsigned long)[myInt retainCount]);

[myArr removeObjectAtIndex:0];

NSLog(@after removal from array=%lx,(unsigned long)[myInt retainCount]);

[pool drain];

Return 0;

}

輸出結果:

myInt retain count=1

after adding to array=2

after asssignment to myInt2=2

myInt after retain=3

myInt2 after retain=3

after release=2

after removal from array=1

檢查addObject方法的文檔,將發現,將對象添加到任何類型的集合都會使該對象的引用次數增長。這就意味着,若是隨後釋放了添加的添加對象,那麼數組中仍然存在着該對象的有效引用,而且對象不會被釋放。

代碼中將myInt賦值給變量myInt2,要注意這個操做並無使myInt對象的引用次數增長,這可能會在之後形成潛在的麻煩。例如若是對myInt的引用次數減小到0,而且它佔用的空間被釋放,那麼myInt2將擁有無效的對象引用(將myInt賦值給myInt2的操做並無複製實際的對象,只是指向myInt在內存中位置的指針)。由於多了一個隊myInt對象的引用,爲保持引用計數的同步,因此經過發送retain消息來同步引用計數。

因此,在示例中,一共有3次對myInt的引用,第一個是實際的對象自己,即建立對象,第二個是數組中的引用,第三個來自賦值引用。其中,添加對象到數組中會引發引用計數增長,可是賦值操做卻不會。

 

整理摘自《objective-c 2.0程序設計》

相關文章
相關標籤/搜索