【发布时间】: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