【问题标题】:Unexpected retainCount意外的保留计数
【发布时间】:2013-04-23 08:49:13
【问题描述】:

通过一个简单的保留/释放场景来看看这个 code-sn-p:

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

【问题讨论】:

标签: objective-c memory-management retaincount


【解决方案1】:

http://www.whentouseretaincount.com

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

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

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

【讨论】:

    猜你喜欢
    • 2016-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-10
    • 1970-01-01
    • 2015-11-27
    • 1970-01-01
    • 2013-04-18
    相关资源
    最近更新 更多