微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

混合C和Objective-C

我正在使用C作为应用程序主干和Objective-C进行GUI,没关系.

但是在Objective-C(.mm文件)中混合这些代码时,我有几个问题:

我可以将STL容器与Objective-C或Cocos2D对象混合在一起吗?

例如.在Objective-C头文件中,可以执行以下操作吗?

#include <vector>
#include <boost\shared_ptr.hpp>
@interface MyClass : NSObject {
  std::vector<boost::shared_ptr<CCSprite> > m_spriteList;
}

然后在.mm文件中,我想做

CCSprite* newSprite = [/* cocos2d stuff here... */];
m_spriteList.push_back(newSprite);

上述代码是否有效?它肯定是在C,但我不知道什么时候混合C和Objective-C和Cocos2D.

2.在Objective-C中使用C智能指针对象的内存管理?

当我尝试在Objective-C中使用C代码时,我想在Objective-C头文件中声明一个C对象作为成员变量.

我有一个C类在test.h标题中声明:

Test{
};

在Objective-C头文件中,我想做

#include "test.h"
#incude <boost/scoped_ptr.hpp>

#include <vector>
@interface MyClass : NSObject {
   Test* m_testObjectPtr; // (1)
   boost::scoped_ptr<Test>  m_testOjbSmartPtr; // (2)
}

在上面的代码中,是(2)还好吗?我可以像C代码一样在Objective-C中使用智能指针吗?我可以假设当MyClass对象被销毁时,将调用Test类析构函数吗?

或者如果(2)在Objective-C中不行,是(1)还好吗?我需要手动调用
在dealloc中删除m_testObjectPtr?

解决方法

您只能在c类上使用智能指针.如果您在Objective-C类中使用,则可能会在某处获得编译错误或崩溃.
您还可以使用具有Objective-c类指针的容器
std::vector<CCSprite *> spriteList;

只要确保您将其插入列表并将其删除后,将其保留.
在这两种情况下,您可以创建一个自己的智能指针,调用按照需要在constructor / destruct / copy中保留和释放,然后不用担心保留释放.
当对象被释放时,会自动调用成员c对象的析构函数.
目标c包装器的一个例子是

template<typename T>
struct shared_objc_object
{
    T *Object;
    shared_objc_object : Object(nil) { }
    shared_objc_object(T *Object) : Object([Object retain]) { }
    shared_objc_object(shared_objc_object &other) :
        Object([other.Object retain]) { }
    ~shared_objc_object() { [Object release]; }
    shared_objc_object &operator =(shared_objc_object &other)
    {
        [Object release];
        Object = [other.Object retain];
    }
}

你可以使用

std::vector<shared_objc_object<CCSprite *>> spriteList;
spriteList.push_back(some_sprite);

并不关心保留/释放

原文地址:https://www.jb51.cc/c/114901.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐