2013-04-29 41 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的周期;无论如何,该对象将被释放,为什么要麻烦?