本人在C++和OC混編時(shí)對(duì)于兩者對(duì)象生命周期有些疑惑狰挡,特別是OC對(duì)象作為C++對(duì)象成員的時(shí)候捂龄,C++對(duì)象會(huì)不會(huì)接管OC對(duì)象的生命周期。
1. OC對(duì)象是C++對(duì)象的成員
定義OC類TestClass
@interface TestClass : NSObject
@end
@implementation TestClass
- (instancetype)init{
if (self = [super init]) {
NSLog(@"TestClass創(chuàng)建對(duì)象");
}
return self;
}
- (void)dealloc{
NSLog(@"TestClass釋放對(duì)象");
}
@end
定義C++類CSimpleClass
class CSimpleClass {
public:
CSimpleClass():_obj_testClass([[TestClass alloc] init]){
}
~CSimpleClass(){
NSLog(@"CSimpleClass對(duì)象釋放");
}
private:
//創(chuàng)建一個(gè)ojbc類的一個(gè)成員
TestClass* _obj_testClass;
};
通過(guò)以下代碼簡(jiǎn)單創(chuàng)建一個(gè)c++棧對(duì)象
CSimpleClass simple;
運(yùn)行的結(jié)果如下:
2017-03-21 10:12:17.891 CPPTest[16199:810785] TestClass創(chuàng)建對(duì)象
2017-03-21 10:12:17.891 CPPTest[16199:810785] CSimpleClass對(duì)象釋放
2017-03-21 10:12:17.891 CPPTest[16199:810785] TestClass釋放對(duì)象
通過(guò)運(yùn)行結(jié)果可以看到加叁,在C++對(duì)象釋放后倦沧,_obj_testClass對(duì)象也被立刻釋放,我們并沒(méi)有手動(dòng)的調(diào)用OC對(duì)象的release函數(shù)它匕。所以在ARC環(huán)境下展融,OC對(duì)象作為C++對(duì)象成員的時(shí)候,C++對(duì)象會(huì)接管OC對(duì)象的生命周期豫柬,OC對(duì)象成員會(huì)在C++對(duì)象釋放后立即釋放告希。
如果定義CSimpleClass類的源文件被設(shè)置為f-no-objc-arc扑浸,C++對(duì)象不會(huì)接管OC對(duì)象的聲明周期。
2. C++對(duì)象是OC對(duì)象的成員
定義OC類TestClass2
@interface TestClass2 : NSObject
@end
@implementation TestClass2{
//這個(gè)是C++類對(duì)象
CSimpleClass simpleClass;
}
- (instancetype)init{
NSLog(@"TestClass2初始化");
return [super init];
}
- (void)dealloc{
NSLog(@"TestClass2被釋放");
}
@end
修改后的CSimpleClass類
class CSimpleClass {
public:
CSimpleClass(){
NSLog(@"CSimpleClass對(duì)象創(chuàng)建");
}
~CSimpleClass(){
NSLog(@"CSimpleClass對(duì)象釋放");
}
};
通過(guò)如何簡(jiǎn)單的代碼:
TestClass2 * obj2 = [[TestClass2 alloc] init];
運(yùn)行結(jié)果如下:
2017-03-21 10:42:04.853 CPPTest[18104:925147] CSimpleClass對(duì)象創(chuàng)建
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對(duì)象釋放
通過(guò)運(yùn)行結(jié)果可以看出 燕偶,當(dāng)C++對(duì)象是OC對(duì)象的成員時(shí)喝噪, C++對(duì)象的生命周期要長(zhǎng)于OC對(duì)象的生命周期。