Gob*_*0st 11 c++ boost smart-pointers objective-c cocos2d-iphone
我使用C++作为应用主干和Objective-C用于GUI,这很好.
但是当谈到在Objective-C++(.mm文件)中将这些代码混合在一起时,我有一些问题:
例如,在Objective-C标题中,我可以执行以下操作吗?
#include <vector>
#include <boost\shared_ptr.hpp>
@interface MyClass : NSObject {
std::vector<boost::shared_ptr<CCSprite> > m_spriteList;
}
Run Code Online (Sandbox Code Playgroud)
然后在.mm
文件中,我想做
CCSprite* newSprite = [/* cocos2d stuff here... */];
m_spriteList.push_back(newSprite);
Run Code Online (Sandbox Code Playgroud)
以上代码有效吗?它肯定是在C++中,但我不确定混合C++和Objective-C和Cocos2D.
当我尝试在Objective-C中使用C++代码时,我想在Objective-C头文件中将C++对象声明为成员变量.
假设我在test.h
标头中声明了一个C++类:
Test{
};
Run Code Online (Sandbox Code Playgroud)
在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)
}
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,是(2)好吗?我可以像在C++代码中一样在Objective-C中使用智能指针吗?我可以假设在Test
销毁MyClass
对象时会调用类析构函数吗?
或者如果(2)在Objective-C++中不合适,(1)好吗?我需要手动调用
delete m_testObjectPtr
的dealloc
?
您只能在c ++类上使用智能指针.如果你在objective-c类上使用then,你将会遇到编译错误或崩溃.
你也可以使用带有objective-c类指针的容器
std::vector<CCSprite *> spriteList;
Run Code Online (Sandbox Code Playgroud)
只需确保在将它们插入列表时保留它们,并在删除它们时将其释放.
在这两种情况下,您都可以创建自己的智能指针,在构造函数/析构/复制中调用retain和release,然后不要担心retain release.
当取消分配对象时,将自动调用成员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];
}
}
Run Code Online (Sandbox Code Playgroud)
你可以使用
std::vector<shared_objc_object<CCSprite *>> spriteList;
spriteList.push_back(some_sprite);
Run Code Online (Sandbox Code Playgroud)
并且不关心保留/释放
归档时间: |
|
查看次数: |
4638 次 |
最近记录: |