我有一个继承自接口的类
@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次,释放只会被调用一次或两次。
答案 0 :(得分:0)
原来我的对象没有包含在@autoreleasepool {...}
中将主叫代码更改为:
@autoreleasepool{
id<IMyClass> myClass = [self setupMyObjectAndStuff];
// ... snip ...
myClass = nil;
}
一旦没有对象的引用,就会释放对象。仪器正确显示了retainCount的数量,其中只有一个是自动释放保留。