-1

用一个简单的保留/释放场景来看看这个代码片段:

#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”?!

4

1 回答 1

5

http://www.whentouseretaincount.com

向已释放对象发送消息是未定义的行为。它可能会崩溃,它可能会工作,它可能会做一些完全出乎意料的事情。

释放后,您的程序不会浪费任何循环来处理新释放的内存(除非您打开malloc scribble),因此行为的未定义部分。

您的程序也不会浪费任何将保留计数减为 0 的周期;无论如何,该对象将被释放,何必呢?

于 2013-04-29T15:55:30.127 回答