美文网首页
C++、OC混编对象生命周期

C++、OC混编对象生命周期

作者: 薛定喵的鹅 | 来源:发表于2017-03-21 11:42 被阅读279次

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

相关文章

  • C++、OC混编对象生命周期

    本人在C++和OC混编时对于两者对象生命周期有些疑惑,特别是OC对象作为C++对象成员的时候,C++对象会不会接管...

  • xcode 未找到 iostream

    OC 和 C++ 混编 类名后缀改为.mm

  • 问题集锦

    OC、C++、Swift混编易遇到如下问题: Use of '@import' when C++ modules ...

  • iOS开发之漫谈OC、C、C++混编

    导读 混编ObjectiveC++ 正题 今天主要讲一下OC与C和C++混编的问题 首先说一下C++文件: 单独把...

  • OC、C、C++ 混编

    .m文件:是OC的源代码 可以写oc、c源代码 obj c 完全兼容 c。 .mm文件:OC与C++混编的代码 可...

  • .a .framework打包注意事项

    静态库中使用了C++混编 我们都知道在OC项目中使用了C++文件来混编的话,就会报如图所示的错误。其最快捷的解决方...

  • C++与Objective-C类型转换

    最近接手的项目是C++和OC混编的,核心业务调用的是C++静态库提供的接口。为了方便项目使用,专门用OC封装了C+...

  • oc c++混编 错误

    file not found 解决办法,找到混编oc和c++的类,这个类 相关的oc中的类。m 后缀名字改为。m...

  • oc Swift 混编

    oc Swift 混编 oc 项目 混编Swift1.1 oc 调用 Swift 的类 和 方法步骤: ...

  • Swift

    混编 15、OC与Swift的混编_海森堡_lichangan的博客-CSDN博客_oc swift 混编[htt...

网友评论

      本文标题:C++、OC混编对象生命周期

      本文链接:https://www.haomeiwen.com/subject/wqiwnttx.html