本人在C++和OC混编时对于两者对象生命周期有些疑惑,特别是OC对象作为C++对象成员的时候,C++对象会不会接管OC对象的生命周期。
1. OC对象是C++对象的成员
定义OC类TestClass
@interface TestClass : NSObject
@end
@implementation TestClass
- (instancetype)init{
if (self = [super init]) {
NSLog(@"TestClass创建对象");
}
return self;
}
- (void)dealloc{
NSLog(@"TestClass释放对象");
}
@end
定义C++类CSimpleClass
class CSimpleClass {
public:
CSimpleClass():_obj_testClass([[TestClass alloc] init]){
}
~CSimpleClass(){
NSLog(@"CSimpleClass对象释放");
}
private:
//创建一个ojbc类的一个成员
TestClass* _obj_testClass;
};
通过以下代码简单创建一个c++栈对象
CSimpleClass simple;
运行的结果如下:
2017-03-21 10:12:17.891 CPPTest[16199:810785] TestClass创建对象
2017-03-21 10:12:17.891 CPPTest[16199:810785] CSimpleClass对象释放
2017-03-21 10:12:17.891 CPPTest[16199:810785] TestClass释放对象
通过运行结果可以看到,在C++对象释放后,_obj_testClass对象也被立刻释放,我们并没有手动的调用OC对象的release函数。所以在ARC环境下,OC对象作为C++对象成员的时候,C++对象会接管OC对象的生命周期,OC对象成员会在C++对象释放后立即释放。
如果定义CSimpleClass类的源文件被设置为f-no-objc-arc,C++对象不会接管OC对象的声明周期。
2. C++对象是OC对象的成员
定义OC类TestClass2
@interface TestClass2 : NSObject
@end
@implementation TestClass2{
//这个是C++类对象
CSimpleClass simpleClass;
}
- (instancetype)init{
NSLog(@"TestClass2初始化");
return [super init];
}
- (void)dealloc{
NSLog(@"TestClass2被释放");
}
@end
修改后的CSimpleClass类
class CSimpleClass {
public:
CSimpleClass(){
NSLog(@"CSimpleClass对象创建");
}
~CSimpleClass(){
NSLog(@"CSimpleClass对象释放");
}
};
通过如何简单的代码:
TestClass2 * obj2 = [[TestClass2 alloc] init];
运行结果如下:
2017-03-21 10:42:04.853 CPPTest[18104:925147] CSimpleClass对象创建
2017-03-21 10:42:04.853 CPPTest[18104:925147] TestClass2初始化
2017-03-21 10:42:04.853 CPPTest[18104:925147] TestClass2被释放
2017-03-21 10:42:04.853 CPPTest[18104:925147] CSimpleClass对象释放
通过运行结果可以看出 ,当C++对象是OC对象的成员时, C++对象的生命周期要长于OC对象的生命周期。