【问题标题】:Returning object keeps incrementing retainCount返回对象不断增加retainCount
【发布时间】:2014-10-15 17:40:01
【问题描述】:

我有一个继承自接口的类

@interface MyClass : NSObject <IMyClass> {
   NativeCppObject* _myInternalObj;
}

-(id) initWithInternalObj:(NativeCppObject*) myInternalObj;

@end

然后我有一个创建这个对象的工厂类

-(id<IMyClass>) createMyClass:(NSString*)myInternalObjParameter
{

  NativeCppObject* nativeObj = new NativeCppObject(...);  
  MyClass ret = [[MyClass alloc] initWithInternalObj:nativeObj];
  return ret;
}

现在我遇到的问题是,当我从 createMyClass 返回值链接这些调用时,返回的 ret 不断被引用并且从未被释放。在我的链结束时,我得到了大约 5 个保留计数,这会阻止我的对象正确释放。

那些电话就像

@implementation MyClassFactory
+(id<IMyClass>) createMyClass:(NSString*) param
{
  return [gFactory createMyClass:param];
}
@end

gFactory 是一个静态 ID。我知道这不是最佳做法,但目前不能轻易改变。

当从 MyClassFactory 调用 createMyClass 时,retain 计数为 3。将其包装到其他“工厂”中只会调用更多的 retain 而不会调用 release。我不明白为什么会这样。

编辑:

这很奇怪。在单步执行代码时,我按了两次“return ret”。保留似乎也被调用了两次。

EDIT2:

我有一个需要这个工厂的类。实际上这是一个测试用例,所以有些代码是通用的

-(id<IMyClass>) setupMyObjectAndStuff
{
  NSString* param;
  return [self setupMyObjectAndStuff:param];
}


-(id<IMyClass>) setupMyObjectAndStuff:(NSString*) param
{
  return [MyClassFactory createMyClass:param];
}

然后在我的主函数中,调用后

id<IMyClass> myClass = [self setupMyObjectAndStuff];

MyClass 的 retain 将被调用 3 或 4 次,而 release 只会被调用一次或两次。

【问题讨论】:

  • 永远不要使用保留计数。曾经。不要这样做。可能存在问题,但依赖保留计数只会让您的问题变得更糟。保留计数永远不可靠。不要使用它。我不确定我是否提到过这一点,但不要使用保留计数。永远。
  • 好的,但从不调用 dealloc。曾经 =)
  • 如果我覆盖保留/释放并自己计算保留计数,结果是相同的
  • 好的。这一切都非常复杂。拥有这个通用的类工厂对你来说是必不可少的吗?另外,忽略保留释放等...您对此有任何具体问题吗?即您是否看到内存使用量增加等...

标签: ios objective-c automatic-ref-counting retain


【解决方案1】:

原来我的对象没有包裹在@autoreleasepool{ ... }

将调用代码改为:

@autoreleasepool{
  id<IMyClass> myClass = [self setupMyObjectAndStuff];
  // ... snip ...
  myClass = nil;
}

一旦不再有对它们的引用,就会释放对象。 Instruments 正确显示了 retainCount 的数量,除了其中一个之外,所有这些都是自动释放保留。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-05
    • 2011-05-14
    • 1970-01-01
    • 2015-02-15
    • 2012-08-28
    • 2018-09-21
    • 2013-02-01
    • 1970-01-01
    相关资源
    最近更新 更多