本人在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对象的生命周期。

分类: 默认 标签: 暂无标签

评论

暂无评论数据

暂无评论数据

目录