混合 C++ 和 Objective-C

2024-03-29

我使用 C++ 作为应用程序主干,使用 Objective-C 作为 GUI,这很好。

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

1. 我可以将 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 header:

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 中使用智能指针吗?我可以假设Test当类的析构函数被调用时MyClass对象被破坏?

或者,如果 (2) 在 Objective-C++ 中不行,那么 (1) 可以吗?我需要手动调用吗delete m_testObjectPtr in dealloc?


您只能在 C++ 类上使用智能指针。如果你在 Objective-C 类上使用 then ,你要么会遇到编译错误,要么会在某个地方崩溃。
您还可以使用带有 Objective-C 类指针的容器,例如

std::vector<CCSprite *> spriteList;

只要确保在将它们插入列表时保留它们并在删除它们时释放它们即可。
在这两种情况下,您都可以创建自己的智能指针,根据需要在构造函数/析构/复制中调用保留和释放,然后不必担心保留释放。
当对象被释放时,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);

并且不关心保留/释放

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

混合 C++ 和 Objective-C 的相关文章

随机推荐

  • “数组下标不是整数”c

    我正在尝试使用 for 循环进行矩阵乘法 但收到错误 数组下标不是整数 请问我可以得到一些帮助吗 include
  • Android Proguard 警告:无法写入资源(重复的 zip 条目)

    我启用了 proguard 并得到 Warning can t write resource META INF LICENSE txt Duplicate zip entry commons io 2 4 jar META INF LICE
  • Singleton 对象 - 在静态块中或在 getInstance() 中;应该使用哪个

    下面是两种实现单例的方法 各自的优点和缺点是什么 静态初始化 class Singleton private Singleton instance static instance new Singleton public Singleton
  • Facebook JSON 字符串的反序列化?

    我无法从运行 fql 查询后生成的 JSON 字符串中提取 facebook 用户的 work history 从属关系和 current loc 我已经上过这门课 public class Data public CurrentLocat
  • UI自动化切换窗口

    我注意到 setforegroundwindow 可能非常不稳定 无论你怎么做 我注意到 在可能的情况下使用 UIAutomation 似乎可以改善情况 例如 获取 WindowPattern 并使用类似以下内容 windowPattern
  • .setAttribute 与 .attribute= 背后发生了什么?

    描述 我正在使用简单javascript设置 a 的值input 我使用了多种看似相同但结果不同的方法 这是一个例子 HTML
  • Spring MVC 请求映射不起作用

    我想用一个控制器创建简单的 hello world 应用程序 没有任何类的普通 spring 可以工作 但是当我添加控制器 更改 xml 文件 按照分步教程 并尝试打开 localhost project hello html 时 它会抛出
  • 从 Android 应用程序中的本机库访问根文件(/system、/dev)

    我有一个原生库 它将尝试在 Android 设备的 system dev 文件夹中创建文件 使用 open fopen 等 现在我已经使用 JNI 和 NDK 将库与 A ndroid 应用程序集成 但在根文件夹中创建文件失败 我尝试从本机
  • 可以使用 Flutter 复制 iOS App Store 转换吗?

    是否可以使用Flutter复制iOS App Store的转场效果 我尝试通过将两个标签放入两个小部件的根布局中来使用英雄动画 但动画看起来很卡顿或者不是我所期望的 但这样做的好处是 当我使用 MaterialPageRoute 时 我可以
  • Logger 和 System.out.println 的输出不按顺序

    我想要记录器的输出inputstream在 Eclipse 控制台中 但每次执行的时候 结果的顺序总是不一样 我有几个类 其中一个主类可以调用其他类 并且我将记录器放入每个方法中进行调试 我将结果打印到控制台 我也有检索的方法inputst
  • 在 javascript 中使用 .css() 设置细边框

    因此 当用户单击页面上的按钮时 我试图在按钮周围设置边框 要设置处理程序 我要 reportButtons click function change border color 我尝试了两种方法来更改其中按钮的边框颜色 第一种方法是使用 c
  • Asp.net mvc 表单发布和分页

    我有一个操作方法 搜索 在发布表单时调用该方法 根据表单的发布值 可能有数千个搜索结果 我想逐页显示搜索视图 但如何知道第一次发布的表单值是什么 这样我就可以通过传递页面参数来调用搜索视图 最好的方法是接受系统的无状态性 每次渲染视图时 请
  • 如何将 C# 转换为 C++ [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 有人可以帮我将 C 转换为 C 吗 这是一个例子 using System using System Net using System
  • Google数据存储-在没有热点的情况下对创建日期字段进行索引

    我正在使用 Google Datastore 需要查询它来检索一些实体 这些实体需要按从最新到最旧的顺序排序 我的第一个想法是拥有一个包含时间戳的 date created 属性 然后我会索引该字段并对该字段进行排序 这种方法的问题是它会导
  • 像 Chanel 应用程序一样自定义集合视图布局

    我正在尝试做一个自定义布局 例如香奈儿应用程序 您可以在应用程序商店中找到该应用程序 https itunes apple com us app chanel fashion id409934435 mt 8 https itunes ap
  • 使用 simple_form 和rails 4 创建多个嵌套表单

    我正在尝试使用以下模型创建一个简单的应用程序 类别 has many gt 问题 has many gt 答案 我有以下用于创建类别 问题的代码 categories form haml html simple form for categ
  • 使用 AWK 进行字数统计

    我有如下文件 这是一个示例文件 该文件将用于测试 this is a sample file this file will be used for testing 我想用AWK来统计单词数 预期输出是 this 2 is 1 a 1 sam
  • 为什么 smartmatch 根据操作数的顺序返回不同的值?

    我有一个数组 以下测试返回 true 1 a 然而 以下测试返回 false a 1 我在 学习 Perl 中读到 智能匹配运算符两侧的值的放置并不重要 但显然在上面的代码中它确实如此 这是为什么 这两个语句检查的是不同的东西吗 除了其他答
  • 经典C++(带类的C)的调用/返回功能,哪些现代语言具有它?

    第 57 页C 的设计和演变 https rads stackoverflow com amzn click com 0201543303 Stroustrup 博士谈到了一个最初是 C with Classes 的一部分的功能 但它不是现
  • 混合 C++ 和 Objective-C

    我使用 C 作为应用程序主干 使用 Objective C 作为 GUI 这很好 但是当谈到在 Objective C mm 文件 中将这些代码混合在一起时 我有几个问题 1 我可以将 STL 容器与 Objective C 或 Cocos