以下
NSImage *image = [[UIImage imageNamed:@"foo.png"] retain];
...
[image release];
我的ç†è§£æ˜¯ï¼Œä»ŽimageNamedè¿”å›žçš„å¯¹è±¡åº”è¯¥æ˜¯è‡ªåŠ¨é‡Šæ”¾çš„ã€‚ä½†æ˜¯å› ä¸ºå¯¹è±¡ä¸Šæœ‰ä¸€ä¸ªä¿ç•™ï¼Œç„¶åŽæ˜¯ä¸€ä¸ªæ˜Žç¡®çš„释放。显å¼å‘布ä¸ä»…会å‡å°‘引用计数,还会触å‘整个对象的释放,而ä¸æ˜¯ç‰å¾…以åŽè¿›è¡ŒGC。å‡è®¾æ˜¯ï¼Œå½“å‘出释放调用时,iOS将首先å°è¯•å‡å°‘对象的引用计数,然åŽæ‰¾å‡ºå½“时没有其他æ£åœ¨å¼•ç”¨è¯¥å¯¹è±¡çš„å…¶ä»–äººï¼Œå› æ¤å®ƒå†³å®šé‡Šæ”¾åˆ†é…的内å˜ã€‚这是æ£ç¡®çš„ç†è§£å’Œå‡è®¾å—?
ç”案 0 :(得分:2)
ä¸ï¼Œè¿™ä¸æ£ç¡®ã€‚
æ¤å¤–ï¼Œä½ å¯¹å†…å˜ç®¡ç†æœ¯è¯çš„看法有点æ¾æ•£ï¼Œæ‰€ä»¥ä½ 的问题有点令人困惑。
所有这些方é¢çš„详细讨论对于SO帖åæ¥è¯´å¤ªè¿‡åˆ†äº†ã€‚
自动å‘å¸ƒæ± ä¸æ˜¯åžƒåœ¾å›žæ”¶ã€‚å¯ä»¥æŠŠå®ƒæƒ³è±¡æˆä¸€ä¸ªå¯¹è±¡é›†åˆã€‚è‡ªåŠ¨é‡Šæ”¾å¯¹è±¡æ—¶ï¼Œè¯¥å¯¹è±¡å°†æ·»åŠ åˆ°æ± ä¸ã€‚å½“æ± è¢«è€—å°½æ—¶ï¼Œå®ƒåŸºæœ¬ä¸Šè°ƒç”¨æ± ä¸æ¯ä¸ªå¯¹è±¡çš„é‡Šæ”¾ï¼ˆå› æ¤ï¼Œåç§°è‡ªåŠ¨é‡Šæ”¾æ± ï¼‰ã€‚
å› æ¤ï¼Œå¦‚果您有一个已自动释放的对象,并且您进行了é¢å¤–çš„retain
调用(没有匹é…çš„ç‰ˆæœ¬ï¼‰ï¼Œåˆ™è‡ªåŠ¨é‡Šæ”¾æ± å°†ä¸ä¼šé‡Šæ”¾è¯¥å¯¹è±¡ã€‚它会åƒå®ƒåº”è¯¥çš„é‚£æ ·åªå‘布一次。
如果您对该对象进行其他引用,该对象ä»å°†ç»§ç»é€šè¿‡è‡ªåŠ¨é‡Šæ”¾æ± 。
多次调用ä¿ç•™/释放åªä¼šå¢žåŠ å’Œå‡å°‘计数。在计数达到零之å‰ï¼Œå¯¹è±¡ä¸ä¼šé‡Šæ”¾ã€‚
ç”案 1 :(得分:1)
è¿™ä¸æ˜¯ä¸€ä¸ªæ£ç¡®çš„å‡è®¾ã€‚ release
在概念上会å¦å®šretain
ã€‚ä½†æ˜¯ï¼Œæ‚¨æ— æ³•äº†è§£å¯èƒ½å˜åœ¨äºŽå…¶ä¸çš„任何其他引用计数。 如果您的retain
是唯一的,那么它将立å³è¢«é”€æ¯ã€‚当然ä¸æ˜¯è¿™æ ·ã€‚
由于我们知é“我们æ£åœ¨èŽ·å¾—ä¸€ä¸ªè‡ªåŠ¨é‡Šæ”¾çš„å¯¹è±¡ï¼Œå› æ¤æˆ‘们知é“我们的retain
引用ä¸æ˜¯å”¯ä¸€çš„。æ¥è‡ªè‡ªåŠ¨é‡Šæ”¾æºçš„原始å‚考将ä¿ç•™ï¼Œç›´åˆ°å½“å‰çš„è‡ªåŠ¨é‡Šæ”¾æ± è€—å°½ã€‚å› æ¤ï¼Œä½ çš„å‡è®¾å˜åœ¨ç¼ºé™·ï¼š
 Âå‘布释放呼å«æ—¶ï¼ŒiOS会首先å°è¯•å‡å°‘å‚è€ƒå· Â Â æŒ‡æœ›å¯¹è±¡ï¼Œç„¶åŽå‘现其他人没有引用该对象   当时的对象,所以它决定释放分é…的内å˜ã€‚
...å› ä¸ºåŽŸå§‹è‡ªåŠ¨é‡Šæ”¾çš„å¼•ç”¨å°†ä¿ç•™ã€‚
一般æ¥è¯´ï¼Œæ‚¨ä¸åº”该对何时解除对象的确切时间åšå‡ºä»»ä½•å‡è®¾ã€‚åªæ˜¯æ‹…心平衡自己的ä¿ç•™è®¡æ•°å¹¶ç›¸ä¿¡äº‹æƒ…会æˆåŠŸã€‚在这个例åä¸ï¼Œå˜åœ¨çš„å‚考文献å¯èƒ½æ¯”您自己的retain
å’Œå‡è®¾çš„autorelease
è¦å¤šå¾—多。åªè¦äº‹æƒ…ä¿æŒå¹³è¡¡ï¼Œæ¡†æž¶å°±å¯ä»¥è‡ªç”±åœ°ä¿ç•™å’Œé‡Šæ”¾ä»–们在幕åŽæ‰€éœ€çš„一切。
最åŽï¼Œåªéœ€ä½¿ç”¨ARC并忘记所有这些:)
ç”案 2 :(得分:1)
æ²¡æœ‰åžƒåœ¾æ”¶é›†ã€‚ä¸¥æ ¼æ¥è¯´ï¼Œå®ƒæ˜¯è®¡ç®—自己引用的对象。创建对象时,它会给自己一个引用计数1.在这ç§æƒ…况下,创建对象的方法 - imageNamed:
- å°†å¯¹è±¡æ”¾å…¥è‡ªåŠ¨é‡Šæ”¾æ± ä¸ã€‚è¿™æ„味ç€è¯¥æ± 是1引用的所有者,它将 auto ç¨åŽé‡Šæ”¾å¼•ç”¨ï¼ˆç¨åŽæ¤æ–¹æ³•å®Œæˆï¼‰ã€‚
当对象的引用计数é™ä¸º0时,它会通过è¿è¡Œdealloc
方法æ¥é”€æ¯è‡ªèº«ã€‚
您å‘图åƒå‘é€retain
(由自动å‘å¸ƒæ± æ‹¥æœ‰ï¼‰æ„味ç€è¿˜æœ‰å¦ä¸€ä¸ªå‚考 - å¦ä¸€ä¸ªæ‰€æœ‰è€… - (计数则为2,但您真的ä¸åº”该考虑对象的内部ç»å¯¹æ•°ï¼Œåªæ˜¯ä½ 的所有æƒã€‚)
游æˆæ± ä»ä¼šå‘é€release
ï¼Œä½†æ˜¯ï¼ˆå¦‚æžœä½ è¿˜æ²¡æœ‰é€šè¿‡å‘é€retain
å‘布所有æƒå£°æ˜Žï¼‰ï¼Œè¿™ä¸ªç‰ˆæœ¬æœ¬èº«ä¸ä¼šä¸¢å¼ƒå‚考数到0,所以对象ä¸ä¼šè¢«é”€æ¯ã€‚
由于您确实å‘é€äº†release
,您已ç»æ”¾å¼ƒäº†æ‚¨çš„声明,并且自动å‘å¸ƒæ± å°†è´Ÿè´£å…¶æ‰€æœ‰æƒ - 但ä»ç„¶ä»¥åŽï¼Œè€Œä¸æ˜¯å½“您å‘é€{ {1}} - 导致图åƒç ´å。
简而言之,ä¸ï¼Œæ‚¨å‘é€release
ä¸ä¼šæ›´æ”¹è‡ªåŠ¨é‡Šæ”¾æ± çš„æ“作。它ä»ç„¶æ‹¥æœ‰è¯¥å¯¹è±¡ï¼Œå¹¶ä¸”ä»ç„¶åœ¨è¿è¡Œå¾ªçŽ¯ç»“æŸæ—¶å‘å…¶å‘é€release
。