Objective-C Retain Count从0到2

时间:2011-04-07 04:48:35

标签: objective-c singleton retaincount

我是Objective-C的新手。这是我在此的头一篇博文。我创建了一个单例,用于管理数据库的应用程序接口。简单来说,我使用了NSMutableArray作为ivar。正如您将在下面的代码和日志输出中看到的那样,在将赋值分配给NSMutableArray对象之前,保留计数为0,然后在赋值后保留计数为2。

我不清楚为什么会这样。是因为[NSMutableArray arrayWithObject:(id)]创建了一个保留计数为1的对象,然后赋值self.dataList会增加保留计数?一次呼叫释放是否安全?这似乎不是正确的事情。

这是来源

#import <Foundation/Foundation.h>


@interface DataInterfaceObject : NSObject {
    NSMutableArray *dataList;

}

@property (nonatomic, retain) NSMutableArray *dataList;

+ (id) sharedAlloc;

@end

...

#import "DataInterface.h"

static DataInterfaceObject *sharedDataInterfaceObject = nil;

@implementation DataInterfaceObject

@synthesize dataList;

+ (id) sharedAlloc {    
    @synchronized(self) {
        if (sharedDataInterfaceObject == nil) 
            sharedDataInterfaceObject = [super alloc];
    }
    return sharedDataInterfaceObject;
}

+ (id) alloc {
    return [[self sharedAlloc] init];
}

- (id)init 
{
    @synchronized(self) {
        NSLog(@"In DataInterface init 1, RetainCount for dataList is %d", [self.dataList retainCount]);
        if (dataList == nil) {
            self = [super init];
            if (self) {
                //Instantiate list
                NSLog(@"In DataInterface init 2, RetainCount for dataList is %d", [self.dataList retainCount]);
                self.dataList = [NSMutableArray arrayWithObjects:@"Dog", @"Cat", @"Homer", @"Vanessa", @"Tour Eiffel", @"Ball", @"Lettuce", nil];
                NSLog(@"In DataInterface init 3, RetainCount for dataList is %d", [self.dataList retainCount]);
            }
        }
    }
    return self;
}

- (void)dealloc 
{
    [dataList release];
    [super dealloc];
}

@end

日志显示以下内容:

2011-04-06 21:18:26.931 jobs[11672:207] initislized
2011-04-06 21:18:26.933 jobs[11672:207] In DataInterface init 1, RetainCount for dataList is 0
2011-04-06 21:18:26.934 jobs[11672:207] In DataInterface init 2, RetainCount for dataList is 0
2011-04-06 21:18:26.934 jobs[11672:207] In DataInterface init 3, RetainCount for dataList is 2

3 个答案:

答案 0 :(得分:4)

不要使用保留计数进行调试,你会发疯的。如果您遇到内存泄漏或过度释放问题,请确保遵循内存管理规则。

Cocoa Core Competencies

Cocoa With Love有一篇关于creating singletons in Cocoa的好文章。

答案 1 :(得分:4)

代码:

[NSMutableArray arrayWithObjects:@"Dog", @"Cat", @"Homer", @"Vanessa",
    @"Tour Eiffel", @"Ball", @"Lettuce", nil];

创建一个自动释放的变量,其保留计数为1,将在以后的某个时间释放。您的属性也调用retain,因此当调用print语句时,该对象的保留计数为2,然后很快将减少为1.

答案 2 :(得分:2)

是的,它直接归结为两个的原因是:a)你创建了对象,b)通过将对象分配给self.dataList来保留对象。但是,你不负责创建对象,因为你没有调用+ alloc,所以你的-dealloc只能释放一次dataList。

那就是说,@ Trerry Wilcox是对的:不要看-retainCount。