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

Objective-C可以在某种程度上与c和 can be called to each other混合使用.但Objective-C对象仍然或多或少地手动管理,并且语言中完全没有RAII习语.我想知道是否有可能用c智能指针管理Objective-C对象的生命周期.特别是现在boost scoped_ptr和shared_ptr都已添加到C 11标准中

解决方法

But Objective-C objects still are more or less manually managed,and RAII idiom is entirely absent from the language.

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

但说不,很无聊.如果你真的想像这样混合Objective-C和C,我们首先需要放松“Objective-C对象”的定义.运行时识别任何以isa作为其第一个成员作为对象的东西,我们可以利用它并编写一个带有相应对象接口的简单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变得更聪明.

相关文章

对象的传值与返回说起函数,就不免要谈谈函数的参数和返回值...
从实现装饰者模式中思考C++指针和引用的选择最近在看...
关于vtordisp知多少?我相信不少人看到这篇文章,多半是来自...
那些陌生的C++关键字学过程序语言的人相信对关键字并...
命令行下的树形打印最近在处理代码分析问题时,需要将代码的...
虚函数与虚继承寻踪封装、继承、多态是面向对象语言的三大特...