将调用release释放自动释放对象?

时间:2012-09-10 16:17:32

标签: objective-c ios memory-management autorelease

以下

NSImage *image = [[UIImage imageNamed:@"foo.png"] retain];
...
[image release];

我的ç†è§£æ˜¯ï¼Œä»ŽimageNamed返回的对象应该是自动释放的。但是因为对象上有一个ä¿ç•™ï¼Œç„¶åŽæ˜¯ä¸€ä¸ªæ˜Žç¡®çš„释放。显å¼å‘布ä¸ä»…会å‡å°‘引用计数,还会触å‘整个对象的释放,而ä¸æ˜¯ç­‰å¾…以åŽè¿›è¡ŒGC。å‡è®¾æ˜¯ï¼Œå½“å‘出释放调用时,iOS将首先å°è¯•å‡å°‘对象的引用计数,然åŽæ‰¾å‡ºå½“时没有其他正在引用该对象的其他人,因此它决定释放分é…的内存。这是正确的ç†è§£å’Œå‡è®¾å—?

3 个答案:

答案 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。