意外的retainCount

-1 memory-management objective-c 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;
}
Run Code Online (Sandbox Code Playgroud)

这是结果输出:

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
Run Code Online (Sandbox Code Playgroud)

最后一个retainCount应为"0"或应用程序崩溃.为什么结果为"1"?!

bbu*_*bum 5

http://www.whentouseretaincount.com

对已释放的对象进行消息传递是未定义的行为.它可能会崩溃,它可能会起作用,它可能会完全出乎意料.

在重新分配时,您的程序不会浪费任何与新释放的内存相关的循环(除非您打开malloc涂鸦),因此行为的未定义部分.

您的程序也不会浪费任何将保留计数减少到0的周期; 无论如何,该对象将被解除分配,为什么要这么麻烦?