【问题标题】:Reference Count or Retain Count Issue (Memory Management)引用计数或保留计数问题(内存管理)
【发布时间】:2016-05-21 06:54:08
【问题描述】:

以下代码运行良好,您可以在系统上运行以进行确认。

我的问题是,如您所见,dealloc 方法仅在保留计数达到零时调用,这意味着为 RetainTracker 对象释放了内存。但是,问题是当我在 dealloc 方法中记录保留计数时,它仍然显示保留计数为 1。这是为什么呢?

这是我的代码:

#import <Foundation/Foundation.h>
@interface RetainTracker : NSObject

@end

@implementation RetainTracker

- (id)init {

    if (self = [super init]) {
        NSLog(@"init: Retain count of %lu",(unsigned long)[self retainCount]);
    }
    return self;
}

- (void)dealloc {

    NSLog(@"Dealloc called bye bye!==>%lu",(unsigned long)self.retainCount);
    [super dealloc];
}

@end

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // insert code here...
        RetainTracker *myRetainTracker = [RetainTracker new];

        [myRetainTracker retain]; // count-->2
        NSLog(@"The retain count is ==>%lu",(unsigned long)myRetainTracker.retainCount);

        [myRetainTracker release];// count -->1
        NSLog(@"The retain count is ==>%lu",(unsigned long)myRetainTracker.retainCount);

        [myRetainTracker retain];// count -->2
        NSLog(@"The retain count is ==>%lu",(unsigned long)myRetainTracker.retainCount);

        [myRetainTracker release];// count -->1
        NSLog(@"The retain count is ==>%lu",(unsigned long)myRetainTracker.retainCount);

        [myRetainTracker release];// count -->0
        NSLog(@"The retain count is ==>%lu",(unsigned long)myRetainTracker.retainCount);

    }
    return 0;
}

这里是日志:

init: Retain count of 1
The retain count is ==>2
The retain count is ==>1
The retain count is ==>2
The retain count is ==>1
Dealloc called bye bye!==>1
The retain count is ==>1

【问题讨论】:

  • 您想要做的不是打印保留计数,而是针对您的代码运行 ObjectAlloc 仪器,并打开引用计数(单击仪器的 (i) 并重新启动记录您的应用程序的仪器)。然后,您可以转到对象的特定实例,并获取它的完整保留/释放历史记录 - 这可以帮助确定是否有东西保留了不应该保留的对象。

标签: objective-c memory-management manual-retain-release


【解决方案1】:

这并不奇怪,release 代码可能看起来像这样(伪代码):

- (void)release {
   if (retainCount > 1) {
      retainCount -= 1
   } else {
      // no need to set the retainCount to 0 here,
      // the object now ends its existence
      [self dealloc]
   }
}

此外,您最后一个 NSLog 实际上正在访问一个不再存在的对象,这可能导致崩溃。

请注意,从retainCount 读取的值永远不应被依赖。这只是一个实现细节。将retainrelease 视为所有权转让更为安全。

来自retainCount 文档:

不要使用这种方法。

此方法在调试内存管理问题时没有任何价值。 (...) 您不太可能从这种方法中获得有用的信息。

【讨论】:

    【解决方案2】:

    将您的项目切换到 ARC。严重地。我已经忘记了三年前我所知道的关于保留/释放的一切。除此之外,对象在被释放过程中的保留计数是没有意义的毫无意义对此感到疑惑。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-10
      • 1970-01-01
      • 2023-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多