返回对象继续递增retainCount

时间:2014-08-21 23:08:38

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

我有一个继承自接口的类

@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时,保留计数就像是3.将其包装到其他&#34;工厂&#34;只是拨打更多的电话来保留,没有新的电话发布。我不明白为什么会这样。

编辑:

这很奇怪。在踩到代码时,我点击了&#34;返回&#34;两次。保留似乎也被称为两次。

EDIT2:

我有一个需要这个工厂的课程。实际上这是一个测试用例,因此一些代码旨在成为通用的

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


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

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

之后
id<IMyClass> myClass = [self setupMyObjectAndStuff];

MyClass retain将被调用3或4次,释放只会被调用一次或两次。

1 个答案:

答案 0 :(得分:0)

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

将主叫代码更改为:

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

一旦没有对象的引用,就会释放对象。仪器正确显示了retainCount的数量,其中只有一个是自动释放保留。