2013-04-29 39 views
-1

看一看這個代碼片段用一個簡單的保留/釋放的情景:意外retainCount

#import <Foundation/Foundation.h> 

@interface SomeClass : NSObject 
@end 

@implementation SomeClass 
@end 

int main(int argc, const char * argv[]) 
{ 
    SomeClass *aClass = [[SomeClass alloc] init]; 
    NSLog(@"retainCount: %lu", [aClass retainCount]); 

    [aClass retain]; 
    NSLog(@"retainCount: %lu", [aClass retainCount]); 

    [aClass release]; 
    NSLog(@"retainCount: %lu", [aClass retainCount]); 

    [aClass release]; 
    NSLog(@"retainCount: %lu", [aClass retainCount]); 

    return 0; 
} 

這是輸出結果:

2013-04-29 17:33:50.695 retainCount: 1 
2013-04-29 17:33:50.697 retainCount: 2 
2013-04-29 17:33:50.697 retainCount: 1 
2013-04-29 17:33:50.698 retainCount: 1 

最後retainCount要麼是「0」或該應用程序應該崩潰。爲什麼結果是「1」?

+0

http://stackoverflow.com/questions/4636146/when-to-use-retaincount?rq=1 – peko 2013-04-29 15:50:35

+8

**絕對不要使用'retainCount' ** – 2013-04-29 15:54:39

+0

'retainCount'意味着什麼。 – xhan 2013-04-29 15:59:15

回答

5

http://www.whentouseretaincount.com

消息傳送的解除分配的目的是未定義的行爲。它可能會崩潰,它可能工作,它可能會做一些完全意想不到的事情。

一旦釋放,您的程序不會浪費任何隨新鮮釋放的內存的循環(除非您打開malloc scribble),因此未定義部分的行爲。

您的程序也不會浪費任何將保留計數遞減到0的週期;無論如何,該對象將被釋放,爲什麼要麻煩?