锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
姝ゆ枃鐗堟潈褰掍綔鑰?/span>Vince Yuan (vince.yuan#gmail.com)鎵鏈夈傛榪庨潪钀ュ埄鎬ц漿杞斤紝杞澆鏃跺繀欏誨寘鍚師濮嬮摼鎺?/span>http://vinceyuan.cnblogs.com錛屼笖蹇呴』鍖呭惈姝ょ増鏉冨0鏄庣殑瀹屾暣鍐呭銆?/span>
鐗堟湰 1.1 鍙戣〃浜?/span>2010-03-08
浜?/span> 鍙h瘈涓庤寖寮?/span>
1 鍙h瘈銆?/span>
1.1 璋佸垱寤猴紝璋侀噴鏀撅紙綾諱技浜?#8220;璋佹薄鏌擄紝璋佹不鐞?#8221;錛夈傚鏋滀綘閫氳繃alloc銆?/span>new鎴?/span>copy鏉ュ垱寤轟竴涓璞★紝閭d箞浣犲繀欏昏皟鐢?/span>release鎴?/span>autorelease銆傛崲鍙ヨ瘽璇達紝涓嶆槸浣犲垱寤虹殑錛屽氨涓嶇敤浣犲幓閲婃斁銆?/span>
渚嬪錛屼綘鍦ㄤ竴涓嚱鏁頒腑alloc鐢熸垚浜嗕竴涓璞★紝涓旇繖涓璞″彧鍦ㄨ繖涓嚱鏁頒腑琚嬌鐢紝閭d箞浣犲繀欏誨湪榪欎釜鍑芥暟涓皟鐢?/span>release鎴?/span>autorelease銆傚鏋滀綘鍦ㄤ竴涓?/span>class鐨勬煇涓柟娉曚腑alloc涓涓垚鍛樺璞★紝涓旀病鏈夎皟鐢?/span>autorelease錛岄偅涔堜綘闇瑕佸湪榪欎釜綾葷殑dealloc鏂規硶涓皟鐢?/span>release錛涘鏋滆皟鐢ㄤ簡autorelease錛岄偅涔堝湪dealloc鏂規硶涓粈涔堥兘涓嶉渶瑕佸仛銆?/span>
1.2 闄や簡alloc銆?/span>new鎴?/span>copy涔嬪鐨勬柟娉曞垱寤虹殑瀵硅薄閮借澹版槑浜?/span>autorelease銆?/span>
1.3 璋?/span>retain錛岃皝release銆傚彧瑕佷綘璋冪敤浜?/span>retain錛屾棤璁鴻繖涓璞℃槸濡備綍鐢熸垚鐨勶紝浣犻兘瑕佽皟鐢?/span>release銆傛湁鏃跺欎綘鐨勪唬鐮佷腑鏄庢槑娌℃湁retain錛屽彲鏄郴緇熶細鍦ㄩ粯璁ゅ疄鐜頒腑鍔犲叆retain銆備笉鐭ラ亾涓轟粈涔堣嫻鏋滃叕鍙哥殑鏂囨。娌℃湁寮鴻皟榪欎釜闈炲父閲嶈鐨勪竴鐐癸紝璇峰弬鑰冭寖寮?/span>2.7鍜岀涓夌珷銆?/span>
2 鑼冨紡銆?/span>
鑼冨紡灝辨槸妯℃澘錛屽氨鏄緷钁姦鐢葷摙銆傜敱浜庝笉鍚屼漢鏈変笉鍚岀殑鐞嗚В鍜屼範鎯紝鎴戞葷粨鐨勮寖寮忎笉涓瀹氶傚悎鎵鏈変漢錛屼絾鎴戣兘淇濊瘉鐓х潃榪欐牱鍋氫笉浼氬嚭闂銆?/span>
2.1 鍒涘緩涓涓璞°?/span>
ClassA *obj1 = [[ClassA alloc] init];
2.2 鍒涘緩涓涓?/span>autorelease鐨勫璞°?/span>
ClassA *obj1 = [[[ClassA alloc] init] autorelease];
2.3 Release涓涓璞″悗錛岀珛鍗蟲妸鎸囬拡娓呯┖銆傦紙欏轟究璇翠竴鍙ワ紝release涓涓┖鎸囬拡鏄悎娉曠殑錛屼絾涓嶄細鍙戠敓浠諱綍浜嬫儏錛?/span>
[obj1 release];
obj1 = nil;
2.4 鎸囬拡璧嬪肩粰鍙︿竴涓寚閽堛?/span>
ClassA *obj2 = obj1;
[obj2 retain];
//do something
[obj2 release];
obj2 = nil;
2.5 鍦ㄤ竴涓嚱鏁頒腑鍒涘緩騫惰繑鍥炲璞★紝闇瑕佹妸榪欎釜瀵硅薄璁劇疆涓?/span>autorelease
ClassA *Func1()
{
ClassA *obj = [[[ClassA alloc]init]autorelease];
return obj;
}
2.6 鍦ㄥ瓙綾葷殑dealloc鏂規硶涓皟鐢ㄥ熀綾葷殑dealloc鏂規硶
-(void) dealloc
{
…
[super dealloc];
}
2.7 鍦ㄤ竴涓?/span>class涓垱寤哄拰浣跨敤property銆?/span>
2.7.1 澹版槑涓涓垚鍛樺彉閲忋?/span>
ClassB *objB;
2.7.2 澹版槑property錛屽姞涓?/span>retain鍙傛暟銆?/span>
@property (retain) ClassB* objB;
2.7.3 瀹氫箟property銆傦紙property鐨勯粯璁ゅ疄鐜拌鐪嬬涓夌珷錛?/span>
@synthesize objB;
2.7.4 闄や簡dealloc鏂規硶浠ュ錛屽緇堢敤.鎿嶄綔絎︾殑鏂瑰紡鏉ヨ皟鐢?/span>property銆?/span>
self.objB 鎴栬?/span>objA.objB
2.7.5 鍦?/span>dealloc鏂規硶涓?/span>release榪欎釜鎴愬憳鍙橀噺銆?/span>
[objB release];
紺轟緥浠g爜濡備笅錛堣緇嗕唬鐮佽鍙傝冮檮浠朵腑鐨?/span>memman-property.m錛屼綘闇瑕佺壒鍒暀鎰忓璞℃槸鍦ㄤ綍鏃惰閿姣佺殑銆傦級錛?/span>
@interface ClassA : NSObject
{
ClassB* objB;
}
@property (retain) ClassB* objB;
@end
@implementation ClassA
@synthesize objB;
-(void) dealloc
{
[objB release];
[super dealloc];
}
@end
2.7.6 緇欒繖涓?/span>property璧嬪兼椂錛屾湁鎵嬪姩release鍜?/span>autorelease涓ょ鏂瑰紡銆?/span>
void funcNoAutorelease()
{
ClassB *objB1 = [[ClassB alloc]init];
ClassA *objA = [[ClassA alloc]init];
objA.objB = objB1;
[objB1 release];
[objA release];
}
void funcAutorelease()
{
ClassB *objB1 = [[[ClassB alloc]init] autorelease];
ClassA *objA = [[[ClassA alloc]init] autorelease];
objA.objB = objB1;
}
紺轟緥浠g爜鏂囦歡閾炬帴錛?/span>http://files.cnblogs.com/VinceYuan/objective-c-memman.zip
鐗堟潈澹版槑
姝ゆ枃鐗堟潈褰掍綔鑰?/span>Vince Yuan (vince.yuan#gmail.com)鎵鏈夈傛榪庨潪钀ュ埄鎬ц漿杞斤紝杞澆鏃跺繀欏誨寘鍚師濮嬮摼鎺?/span>http://vinceyuan.cnblogs.com/錛屼笖蹇呴』鍖呭惈姝ょ増鏉冨0鏄庣殑瀹屾暣鍐呭銆?/span>
鐗堟湰 1.1 鍙戣〃浜?/span>2010-03-08
鍓嶈█
鍒濆objectice-C鐨勬湅鍙嬮兘鏈変竴涓洶鎯戯紝鎬昏寰楀objective-C鐨勫唴瀛樼鐞嗘満鍒剁悽紓ㄤ笉閫忥紝紼嬪簭緇忓父鍐呭瓨娉勬紡鎴栬帿鍚嶅叾濡欑殑宕╂簝銆傛垜鍦ㄨ繖閲屾葷粨浜嗚嚜宸卞objective-C鍐呭瓨綆$悊鏈哄埗鐨勭爺絀舵垚鏋滃拰緇忛獙錛屽啓浜嗚繖涔堜竴涓敱嫻呭叆娣辯殑鏁欑▼銆傚笇鏈涘澶у鏈夋墍甯姪錛屼篃嬈㈣繋澶у涓璧鋒帰璁ㄣ?/span>
姝ゆ枃娑夊強鐨勫唴瀛樼鐞嗘槸閽堝浜庣戶鎵夸簬NSObject鐨?/span>Class銆?/span>
涓 鍩烘湰鍘熺悊
Objective-C鐨勫唴瀛樼鐞嗘満鍒朵笌.Net/Java閭g鍏ㄨ嚜鍔ㄧ殑鍨冨溇鍥炴敹鏈哄埗鏄笉鍚岀殑錛屽畠鏈川涓婅繕鏄?/span>C璇█涓殑鎵嬪姩綆$悊鏂瑰紡錛屽彧涓嶈繃紼嶅井鍔犱簡涓浜涜嚜鍔ㄦ柟娉曘?/span>
1 Objective-C鐨勫璞$敓鎴愪簬鍫嗕箣涓婏紝鐢熸垚涔嬪悗錛岄渶瑕佷竴涓寚閽堟潵鎸囧悜瀹冦?/span>
ClassA *obj1 = [[ClassA alloc] init];
2 Objective-C鐨勫璞″湪浣跨敤瀹屾垚涔嬪悗涓嶄細鑷姩閿姣侊紝闇瑕佹墽琛?/span>dealloc鏉ラ噴鏀劇┖闂達紙閿姣侊級錛屽惁鍒欏唴瀛樻硠闇層?/span>
[obj1 dealloc];
榪欏甫鏉ヤ簡涓涓棶棰樸備笅闈唬鐮佷腑obj2鏄惁闇瑕佽皟鐢?/span>dealloc錛?/span>
ClassA *obj1 = [[ClassA alloc] init];
ClassA *obj2 = obj1;
[obj1 hello]; //杈撳嚭hello
[obj1 dealloc];
[obj2 hello]; //鑳藉鎵ц榪欎竴琛屽拰涓嬩竴琛屽悧錛?/span>
[obj2 dealloc];
涓嶈兘錛屽洜涓?/span>obj1鍜?/span>obj2鍙槸鎸囬拡錛屽畠浠寚鍚戝悓涓涓璞★紝[obj1 dealloc]宸茬粡閿姣佽繖涓璞′簡錛屼笉鑳藉啀璋冪敤[obj2 hello]鍜?/span>[obj2 dealloc]銆?/span>obj2瀹為檯涓婃槸涓棤鏁堟寚閽堛?/span>
濡備綍閬垮厤鏃犳晥鎸囬拡錛熻鐪嬩笅涓鏉°?/span>
3 Objective-C閲囩敤浜嗗紩鐢ㄨ鏁?/span>(ref count鎴栬?/span>retain count)銆傚璞$殑鍐呴儴淇濆瓨涓涓暟瀛楋紝琛ㄧず琚紩鐢ㄧ殑嬈℃暟銆備緥濡傦紝鏌愪釜瀵硅薄琚袱涓寚閽堟墍鎸囧悜錛堝紩鐢級閭d箞瀹冪殑retain count涓?/span>2銆傞渶瑕侀攢姣佸璞$殑鏃跺欙紝涓嶇洿鎺ヨ皟鐢?/span>dealloc錛岃屾槸璋冪敤release銆?/span>release浼氳retain count鍑?/span>1錛屽彧鏈?/span>retain count絳変簬0錛岀郴緇熸墠浼氳皟鐢?/span>dealloc鐪熸閿姣佽繖涓璞°?/span>
ClassA *obj1 = [[ClassA alloc] init]; //瀵硅薄鐢熸垚鏃訛紝retain count = 1
[obj1 release]; //release浣?/span>retain count鍑?/span>1錛?/span>retain count = 0錛?/span>dealloc鑷姩琚皟鐢?/span>,瀵硅薄琚攢姣?/span>
鎴戜滑鍥炲ご鐪嬬湅鍒氬垰閭d釜鏃犳晥鎸囬拡鐨勯棶棰橈紝鎶?/span>dealloc鏀規垚release瑙e喅浜嗗悧錛?/span>
ClassA *obj1 = [[ClassA alloc] init]; //retain count = 1
ClassA *obj2 = obj1; //retain count = 1
[obj1 hello]; //杈撳嚭hello
[obj1 release]; //retain count = 0錛屽璞¤閿姣?/span>
[obj2 hello];
[obj2 release];
[obj1 release]涔嬪悗錛?/span>obj2渚濈劧鏄釜鏃犳晥鎸囬拡銆傞棶棰樹緷鐒舵病鏈夎В鍐熾傝В鍐蟲柟娉曡涓嬩竴鏉°?/span>
4 Objective-C鎸囬拡璧嬪兼椂錛?/span>retain count涓嶄細鑷姩澧炲姞錛岄渶瑕佹墜鍔?/span>retain銆?/span>
ClassA *obj1 = [[ClassA alloc] init]; //retain count = 1
ClassA *obj2 = obj1; //retain count = 1
[obj2 retain]; //retain count = 2
[obj1 hello]; //杈撳嚭hello
[obj1 release]; //retain count = 2 – 1 = 1
[obj2 hello]; //杈撳嚭hello
[obj2 release]; //retain count = 0錛屽璞¤閿姣?/span>
闂瑙e喅錛佹敞鎰忥紝濡傛灉娌℃湁璋冪敤[obj2 release]錛岃繖涓璞$殑retain count濮嬬粓涓?/span>1錛屼笉浼氳閿姣侊紝鍐呭瓨娉勯湶銆?/span>(1-4鍙互鍙傝冮檮浠朵腑鐨勭ず渚嬬▼搴?/span>memman-no-pool.m)
榪欐牱鐨勭‘涓嶄細鍐呭瓨娉勯湶錛屼絾浼間箮鏈夌偣楹葷儲錛屾湁娌℃湁綆鍗曠偣鐨勬柟娉曪紵瑙佷笅涓鏉°?/span>
5 Objective-C涓紩鍏ヤ簡autorelease pool錛堣嚜鍔ㄩ噴鏀懼璞℃睜錛夛紝鍦ㄩ伒瀹堜竴浜涜鍒欑殑鎯呭喌涓嬶紝鍙互鑷姩閲婃斁瀵硅薄銆傦紙autorelease pool渚濈劧涓嶆槸.Net/Java閭g鍏ㄨ嚜鍔ㄧ殑鍨冨溇鍥炴敹鏈哄埗錛?/span>
5.1 鏂扮敓鎴愮殑瀵硅薄錛屽彧瑕佽皟鐢?/span>autorelease灝辮浜嗭紝鏃犻渶鍐嶈皟鐢?/span>release錛?/span>
ClassA *obj1 = [[[ClassA alloc] init] autorelease]; //retain count = 1 浣嗘棤闇璋冪敤release
5.2 瀵逛簬瀛樺湪鎸囬拡璧嬪肩殑鎯呭喌錛屼唬鐮佷笌鍓嶉潰綾諱技銆?/span>
ClassA *obj1 = [[[ClassA alloc] init] autorelease]; //retain count = 1
ClassA *obj2 = obj1; //retain count = 1
[obj2 retain]; //retain count = 2
[obj1 hello]; //杈撳嚭hello
//瀵逛簬obj1錛屾棤闇璋冪敤錛堝疄闄呬笂涓嶈兘璋冪敤錛?/span>release
[obj2 hello]; //杈撳嚭hello
[obj2 release]; //retain count = 2-1 = 1
緇嗗績鐨勮鑰呰偗瀹氳兘鍙戠幇榪欎釜瀵硅薄娌℃湁琚攢姣侊紝浣曟椂閿姣佸憿錛熻皝鍘婚攢姣佸畠錛燂紙鍙互鍙傝冮檮浠朵腑鐨勭ず渚嬬▼搴?/span>memman-with-pool.m錛夎鐪嬩笅涓鏉°?/span>
6 autorelease pool鍘熺悊鍓栨瀽銆傦紙鍏跺疄寰堢畝鍗曠殑錛屼竴瀹氳鍧氭寔鐪嬩笅鍘伙紝鍚﹀垯榪樻槸涓嶈兘鐞嗚ВObjective-C鐨勫唴瀛樼鐞嗘満鍒躲傦級
6.1 autorelease pool涓嶆槸澶╃敓鐨勶紝闇瑕佹墜鍔ㄥ垱绔嬨傚彧涓嶈繃鍦ㄦ柊寤轟竴涓?/span>iphone欏圭洰鏃訛紝xcode浼氳嚜鍔ㄥ府浣犲啓濂姐?/span>autorelease pool鐨勭湡鍚嶆槸NSAutoreleasePool銆?/span>
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
6.2 NSAutoreleasePool鍐呴儴鍖呭惈涓涓暟緇勶紙NSMutableArray錛夛紝鐢ㄦ潵淇濆瓨澹版槑涓?/span>autorelease鐨勬墍鏈夊璞°傚鏋滀竴涓璞″0鏄庝負autorelease錛岀郴緇熸墍鍋氱殑宸ヤ綔灝辨槸鎶婅繖涓璞″姞鍏ュ埌榪欎釜鏁扮粍涓幓銆?/span>
ClassA *obj1 = [[[ClassA alloc] init] autorelease]; //retain count = 1錛屾妸姝ゅ璞″姞鍏?/span>autorelease pool涓?/span>
6.3 NSAutoreleasePool鑷韓鍦ㄩ攢姣佺殑鏃跺欙紝浼氶亶鍘嗕竴閬嶈繖涓暟緇勶紝release鏁扮粍涓殑姣忎釜鎴愬憳銆傚鏋滄鏃舵暟緇勪腑鎴愬憳鐨?/span>retain count涓?/span>1錛岄偅涔?/span>release涔嬪悗錛?/span>retain count涓?/span>0錛屽璞℃寮忚閿姣併傚鏋滄鏃舵暟緇勪腑鎴愬憳鐨?/span>retain count澶т簬1錛岄偅涔?/span>release涔嬪悗錛?/span>retain count澶т簬0錛屾瀵硅薄渚濈劧娌℃湁琚攢姣侊紝鍐呭瓨娉勯湶銆?/span>
6.4 榛樿鍙湁涓涓?/span>autorelease pool錛岄氬父綾諱技浜庝笅闈㈣繖涓緥瀛愩?/span>
int main (int argc, const char *argv[])
{
NSAutoreleasePool *pool;
pool = [[NSAutoreleasePool alloc] init];
// do something
[pool release];
return (0);
} // main
鎵鏈夋爣璁頒負autorelease鐨勫璞¢兘鍙湁鍦ㄨ繖涓?/span>pool閿姣佹椂鎵嶈閿姣?/span>銆傚鏋滀綘鏈夊ぇ閲忕殑瀵硅薄鏍囪涓?/span>autorelease錛岃繖鏄劇劧涓嶈兘寰堝ソ鐨勫埄鐢ㄥ唴瀛橈紝鍦?/span>iphone榪欑鍐呭瓨鍙楅檺鐨勭▼搴忎腑鏄緢瀹規槗閫犳垚鍐呭瓨涓嶈凍鐨勩備緥濡傦細
int main (int argc, const char *argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
int i, j;
for (i = 0; i < 100; i++ )
{
for (j = 0; j < 100000; j++ )
[NSString stringWithFormat:@"1234567890"];//浜х敓鐨勫璞℃槸autorelease鐨勩?/span>
}
[pool release];
return (0);
} // main
錛堝彲浠ュ弬鑰冮檮浠朵腑鐨勭ず渚嬬▼搴?/span>memman-many-objs-one-pool.m錛岃繍琛屾椂閫氳繃鐩戞帶宸ュ叿鍙互鍙戠幇浣跨敤鐨勫唴瀛樺湪鎬ュ墽澧炲姞錛岀洿鍒?/span>pool閿姣佹椂鎵嶈閲婃斁錛変綘闇瑕佽冭檻涓嬩竴鏉°?/span>
7 Objective-C紼嬪簭涓彲浠ュ祵濂楀垱寤哄涓?/span>autorelease pool銆傚湪闇瑕佸ぇ閲忓垱寤哄眬閮ㄥ彉閲忕殑鏃跺欙紝鍙互鍒涘緩鍐呭祵鐨?/span>autorelease pool鏉ュ強鏃墮噴鏀懼唴瀛樸?span style="font-size: 10.5pt; ">錛堟劅璋㈢綉鍙?/span>hhyytt鍜?/span>neogui鐨勬彁閱掞紝鏌愪簺鎯呭喌涓嬶紝緋葷粺浼氳嚜鍔ㄥ垱寤?/span>autorelease pool, 璇峰弬瑙佺鍥涚珷錛?/span>
int main (int argc, const char *argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
int i, j;
for (i = 0; i < 100; i++ )
{
NSAutoreleasePool *loopPool = [[NSAutoreleasePool alloc] init];
for (j = 0; j < 100000; j++ )
[NSString stringWithFormat:@"1234567890"];//浜х敓鐨勫璞℃槸autorelease鐨勩?/span>
[loopPool release];
}
[pool release];
return (0);
} // main
錛堝彲浠ュ弬鑰冮檮浠朵腑鐨勭ず渚嬬▼搴?/span>memman-many-objs-many-pools.m錛屽崰鐢ㄥ唴瀛樼殑鍙樺寲鏋佸皬錛?/span>
紺轟緥浠g爜鏂囦歡閾炬帴錛?/span>http://files.cnblogs.com/VinceYuan/objective-c-memman.zip
Option-Double-Click 鐐瑰嚮鏂規硶,綾繪垨鏄嚱鏁?XCode 浼氳嚜鍔ㄥ湪甯姪鏂囨。涓煡璇㈠畠浠?
涓ょ瀛楃涓茶繘琛岃漿鎹? const char *foo = "Blah blah"; NSString *bar; // Create an NSString from a C string bar = [NSString stringWithUTF8String:foo]; // Create a C string from an NSString foo = [bar UTF8String];