【问题标题】:Objective-C Retain Count goes from 0 to 2Objective-C 保留计数从 0 变为 2
【发布时间】:2011-07-31 08:57:00
【问题描述】:

我是 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

【问题讨论】:

标签: objective-c singleton retaincount


【解决方案1】:

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

Cocoa Core Competencies

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

【讨论】:

    【解决方案2】:

    代码:

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

    创建一个保留计数为 1 的自动释放变量,该变量将在未来某个时间释放。你的属性也调用了retain,所以当调用print语句时对象的retain计数为2,然后很快就会减少到1。

    【讨论】:

    • “很快”意味着每当相应的自动释放池耗尽时,通常(但不一定)在运行循环迭代时。
    • 最好将保留计数纯粹视为增量,而不是绝对数字。顺便提一句;在上面,所有这些字符串对象的绝对[无用]保留计数为 ~2147483647
    【解决方案3】:

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

    也就是说,@Terry Wilcox 是对的:不要看 -retainCount。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-18
      • 1970-01-01
      • 2011-05-22
      • 1970-01-01
      • 1970-01-01
      • 2011-04-27
      • 2023-04-09
      • 1970-01-01
      相关资源
      最近更新 更多