使用c ++ std :: unique_ptr <>或std :: shared_ptr <>管理objective-C对象

 广东蒗缦m莎 发布于 2023-02-08 16:00

Objective-C可以在某种程度上与c ++混合使用,并且可以相互调用.但Objective-C对象仍然或多或少地手动管理,并且语言中完全没有RAII习语.我想知道是否有可能用c ++智能指针来管理Objective-C对象的生命周期.特别是现在既增强scoped_ptrshared_ptr已添加到C++ 11标准

1 个回答
  • 但Objective-C对象仍然或多或少地手动管理,并且语言中完全没有RAII习语.

    我想无论如何这似乎都会回答你的问题.因为Objective-C对象是引用计数的,所以它们已经实现了为以下目的创建智能指针的目的:将对象的生命周期与其包含的方法的范围进行离婚或绑定. scoped_ptr可以使用自动释放池重新创建shared_ptrs ,并且-retain- -releasestrong参考.

    但说不,很无聊.如果你真的想要像这样混合Objective-C和C++,我们首先需要放松"Objective-C对象"的定义.运行时isa将first作为其第一个成员识别为对象,我们可以利用它并编写一个带有相应对象接口的简单C++类,以便可以发送消息:

    @interface CFIObject : NSObject
    - (void)doSomething;
    @end
    
    struct CFIObject_cxx {
        Class isa;
    public:
        CFIObject_cxx() : isa([CFIObject class]) {}
    ~CFIObject_cxx() { printf("I'm dying!"); }
    };
    
    @implementation CFIObject
    - (void)doSomething {
        NSLog("I did something.");
    }
    @end
    

    我们现在可以实例化一个C++对象的实例并将其包装在一个智能指针中,我将故意拆分为两个方法来说明对象的生命周期:

    void func() {
        // Instantiate a smart pointer with our fake object.
        std::unique_ptr<CFIObject_cxx> cppObj (new CFIObject_cxx());
        id obj = (__bridge id)(cppObj.get());
        // The runtime thinks we're an object.
        [obj doSomething];
        // aaaand, it's out of scope.
    }
    
    int main(int argc, const char **argv) {
        func();
        return 0;
    }
    

    正如人们所料,这会打印:

    2013-12-22 17:23:22.681 Test[77528:303] I did something
    I'm dying!
    

    到控制台.

    如果需要,析构函数可以配备来调用-dealloc以模拟正确的对象破坏,但我希望你看到所有这些都是完全没必要的,特别是随着每次发布CLANG,ARC变得越来越聪明.

    2023-02-08 16:02 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有