看了(ji¨£n)下官æ–ÒŽ(gu¨©)–‡æ¡£çš„关于object c 的内å˜ç®¡ç?æ€È»“ä¸?
在iphoneä¸object c ä¸çš„å†…å˜½Ž¡ç†æ˜¯é€šè¿‡è®¡æ•°å™¨æ¥½Ž¡ç†çš?æ¯ä¸ªå¯¹è±¡å†…部都有一个计数器.æ–°å¾ä¸€ä¸ªå¯¹è±?或者这个对象被其他对象引用,多会(x¨¬)使计数器åŠ?.Retain å¢žåŠ è®¡æ•°å™¨å€?/span>release å‡å°‘计数器å€?当计数器ä¸?时对象就dealloc自己.
在object cä¸ä½ 生æˆçš„ä¸€ä¸ªå¯¹è±¡é‚£ä¹ˆä½ ž®±æœ‰è´£ä“Q去释攑֮ƒåQŒå†…å˜ç®¡ç†çš„一般规则:(x¨¬)
-
You own any object you create by allocating memory for it or copying it.
Related methods:alloc,allocWithZone:,copy,copyWithZone:,mutableCopy,mutableCopyWithZone:
-
If you are not the creator of an
object, but want to ensure it stays in memory for you to use, you can
express an ownership interest in it.
Related method:retain
-
If you own an object, either by
creating it or expressing an ownership interest, you are responsible for
releasing it when you no longer need it.
Related methods:release,autorelease
-
Conversely, if you are not the creator of an object and have not expressed an ownership interest, you mustnotrelease it.
考虑下题q™ä¸ªä¾‹ååQ?/div>
Thingamajig *thingamajig = [[Thingamajig alloc] init];
NSArray *sprockets = [thingamajig sprockets];
[thingamajig release];
thingamajig 需è¦releaseåQŒå› 为很昄¡„¶˜q™é‡Œæˆ‘们æ˜?span style="font-family: 'Courier New';">thingamajigçš„owner。(½W¬ä¸€æ¡è§„则)(j¨ª)
那么sprocketsä¸ÞZ»€ä¹ˆä¸éœ€è¦?span style="font-family: 'Courier New';">releaseå‘¢ã€?br />
é¦–å…ˆæˆ‘ä»¬ä¸æ˜¯sprocketsçš?creater.åQˆç¬¬ä¸€æ¡è§„则)(j¨ª),我们也没有expressing an ownership intereståQŒå› 为我们没æœ?/span>
retain它,åQˆç¬¬äºŒæ¡è§„则åQ?所以我们ä¸è´Ÿè´£release它ã€?/span>
具体æ¥çœ‹thingamajigçš?span style="font-family: 'Courier New';">sprocketsæ–ÒŽ(gu¨©)³•的实玎ͼš(x¨¬)
(NSArray *)sprockets {
NSArray *array;
array = [[NSArray alloc] initWithObjects:mainSprocket,auxiliarySprocket, nil];
return [array autorelease];
}
å¯è§åˆ†é…的内å˜åœ¨æ–ÒŽ(gu¨©)³•里就已ç»ç”?span style="font-family: 'Courier New';">autorelease释放äº?ji¨£n),åªä¸˜q‡æ˜¯½EåŽé‡Šæ”¾ã€‚å‚è§autorelease poolã€?/span>
˜q™é‡Œæœ‰ä¸ªå¾ˆé‡è¦çš„原则åQ?/strong>
Becausethe classcreates the new object,itis responsible for disposing of the new object.
˜q™ä¸ªå¯¹è±¡åœ¨å“ªé‡Œç”Ÿæˆçš„åQŒå°±åº”该在哪里释放ã€?/strong>
æ‰€ä»¥ä½ çœ‹åˆ°å¾ˆå¤š¾cÀLœ‰ä»¥è‡ªå·Þq±»å䨓(f¨´)æ–ÒŽ(gu¨©)³•çš„æž„é€ å‡½æ•ŽÍ¼Œä½ 调用的时候就ä¸éœ€è¦release.å› äØ“(f¨´)åœ¨è¿™ä¸ªæž„é€ å‡½æ•îC¸å·²ç»å?/span>
˜q?/span>autoreleaseäº?ji¨£n)ã€?/span>
ä½ æ²¡æœ‰alloc˜q™ä¸ªå¯¹è±¡ž®×ƒ¸è´Ÿè´£releaseå®?/span>
现在æ¥çœ‹è§„则2åQŒæœ‰äº›æ—¶å€™æˆ‘们在自己的类里è¦å¼•用其他的对象,如把˜q™ä¸ªå…¶ä»–çš„å¯¹è±¡å˜æˆè‡ªå·Þqš„æˆå‘˜å˜é‡ã€?/div>
那么ž®±æœ‰ä¸€ä¸ªé—®é¢˜ï¼Œ˜q™ä¸ªè¢«å¼•用的对象是å¦è¢«releaseä¸è¢«ä½ 控åˆÓž¼Œä¸€æ—¦å®ƒè¢«releaseåQŒä½ 自己的程åºå°±ä¼?x¨¬)出问é¢?/div>
˜q™æ—¶å€™æˆ‘们就需è¦retain˜q™ä¸ªå¯¹è±¡ã€‚表½CÞZ½ ˜q™ä¸ª¾cÖM¹Ÿæ‹¥æœ‰˜q™ä¸ªå¯¹è±¡åQŒåªæœ‰ä½ 自己的类releaseåŽï¼Œè¢«å¼•ç”¨çš„å¯¹è±¡æ‰æœ‰å¯èƒ½è¢«release
一般的set æ–ÒŽ(gu¨©)³•åQ?/div>
@interface Counter : NSObject {
NSNumber *count;
}
- (void)setCount:(NSNumber *)newCount {
[newCount retain];
[count release];
count = newCount;
}
在set䏿ˆ‘ä»¬å¯¹ä¼ è¿›æ¥çš„对象˜q›è¡Œäº?ji¨£n)retain. ä¸ÞZ»€ä¹ˆè¦å…?span style="font-family: 'Courier New';">retainå?span style="font-family: 'Courier New';">releaseåQŒå› 为如æž?span style="font-family: 'Courier New';">newCountå’?span style="font-family: 'Courier New';">count是åŒä¸€ä¸ªå¯¹è±?/div>
å…ˆreleaseçš„è¯ä¼?x¨¬)导致这个对象delloc.

]]>
Ö÷Õ¾Ö©Öë³ØÄ£°å£º
È«ÖÝÏØ|
¶î¶û¹ÅÄÉÊÐ|
¼ÃÄÏÊÐ|
è÷äüÏØ|
ƽÀÖÏØ|
ãÉÐÐÇø|
Ö¾µ¤ÏØ|
ÅìºþÏØ|
ºÚÉ½ÏØ|
ÕżҸÛÊÐ|
ÀÉÏªÏØ|
´¾°²ÏØ|
·ïÉ½ÏØ|
ÇúÎÖÏØ|
ÓÀºÍÏØ|
»á¶«ÏØ|
°¢ºÏÆæÏØ|
ÎäÄþÏØ|
ͨ»¯ÊÐ|
´óÒ¦ÏØ|
ÁèÔÆÏØ|
ÏåÔ«ÏØ|
ÐÂÉÛÏØ|
¿ª·âÊÐ|
ÂÞ¶¨ÊÐ|
ÇåË®ÏØ|
µÂ°²ÏØ|
´ó¹ØÏØ|
¹ÌÔÊÐ|
Ö¾µ¤ÏØ|
ÇåÔ|
ÖÛÇúÏØ|
ÉÏË¼ÏØ|
ÓÀ´¨ÊÐ|
¸»´¨|
Ñ®ÒØÏØ|
¹ãÄÏÏØ|
ÙÙÖÝÊÐ|
ÒÇÂ¤ÏØ|
Õ´»¯ÏØ|
µ¤Õ¯ÏØ|