Objective-C的retainCount的基本用法

wil*_*ang 0 objective-c retaincount

我们都知道retain方法会为+1 retainCount,释放时会保留-1 retainCount,如果retainCount == 0,则对象dealloc.但是我遇到了一个问题,下面的代码运行得到了荒谬的结果

#import <Foundation/Foundation.h>
@interface Person : NSObject
@property(nonatomic, retain) NSString *name;
@property(nonatomic, assign) NSInteger age;

@end

@implementation Person
- (id)init
{
    self = [super init];
    if (self) {
        self.name = @"name";
        self.age = 20;
    }
    return self;
}

- (void)dealloc
{
    NSLog(@"dealloc");
    [super dealloc];
}
@end

int main(int argc, const char * argv[])
{
    Person *per1 = [[Person alloc] init];
    NSLog(@"retainCount = %lu -- 1",[per1 retainCount]);
    [per1 release];
    [per1 retain];
    NSLog(@"retainCount = %lu -- 2",[per1 retainCount]);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

结果是:

2014-01-11 21:56:23.887 blockTest[1287:303] retainCount = 1 -- 1
2014-01-11 21:56:23.889 blockTest[1287:303] dealloc
2014-01-11 21:56:23.889 blockTest[1287:303] retainCount = 2 -- 2
Run Code Online (Sandbox Code Playgroud)

我不使用ARC.为什么我得到这个结果?应用程序不应该崩溃吗?

gra*_*rks 7

这里发生的事情是,虽然对象已经被释放,但是存储它的内存还没有被覆盖,所以后来的调用仍然有效,因为数据暂时仍在那里.

最后得到retainCount2 的原因是,当你发送release到1的对象时retainCount,他们只是dealloc直接对象,而不必费心将内部计数减少到零.