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

2024-02-04

Objective-C 可以在某种程度上与 C++ 混合,可以互相打电话 https://stackoverflow.com/q/1061005/1792701。但 Objective-C 对象仍然或多或少是手动管理的,并且 RAII 习惯用法在该语言中完全不存在。我想知道是否可以使用 C++ 智能指针来管理 Objective-C 对象的生命周期。特别是现在两者都增强了scoped_ptr and shared_ptr已添加到 C++11 标准中


但 Objective-C 对象仍然或多或少是手动管理的,并且 RAII 习惯用法在该语言中完全不存在。

我认为无论如何这似乎可以回答你的问题。因为 Objective-C 对象是引用计数的,所以它们已经实现了创建智能指针的目的:将对象的生命周期与其所包含的方法的范围分开或捆绑在一起。scoped_ptr可以使用自动释放池重新创建,并且shared_ptrs with -retain--release or strong参考。

但说“不”很无聊。如果你真的想像这样混合 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 变得更加智能。

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

使用 c++ std::unique_ptr<> 或 std::shared_ptr<> 管理 Objective-C 对象 的相关文章

  • 如何捕获未发送到 stdout 的命令行文本?

    我在项目中使用 LAME 命令行 mp3 编码器 我希望能够看到某人正在使用什么版本 如果我只执行 LAME exe 而不带参数 我会得到 例如 C LAME gt LAME exe LAME 32 bits version 3 98 2
  • 带有 Core Data 对象的动态 UITableView 高度

    过去几天我一直在试图解决一个谜团 即为什么我的批处理大小为 20 的 NSFetchedResultsController 总是在获取完成后立即错误 即加载到内存中 我的所有对象 从而导致请求需要约 20 秒 事实证明 这是因为在我的 he
  • 如何填充 ToolStripComboBox?

    我发现它很难将数据绑定到ToolStripComboBox 好像没有这个ValueMember and DisplayMember特性 怎么绑定呢 访问toolstripcombobox中包装的组合框并访问其ValueMember Disp
  • 如何使用 Castle Windsor 将对象注入到 WCF IErrorHandler 实现中?

    我正在使用 WCF 开发一组服务 该应用程序正在使用 Castle Windsor 进行依赖注入 我添加了一个IErrorHandler通过属性添加到服务的实现 到目前为止一切正常 这IErrorHandler对象 一个名为FaultHan
  • 当一组凭据下的计划任务启动的进程在另一组凭据下运行另一个程序时,Windows 是否有限制

    所以我有一个简单的例子 其中我有应用程序 A 它对用户 X 本地管理员 有一些硬编码的凭据 然后它使用硬编码的绝对路径启动带有这些凭据的应用程序 B A 和 B 以及 dotnet 控制台应用程序 但是它们不与控制台交互 只是将信息写入文件
  • 将 Long 转换为 DateTime 从 C# 日期到 Java 日期

    我一直尝试用Java读取二进制文件 而二进制文件是用C 编写的 其中一些数据包含日期时间数据 当 DateTime 数据写入文件 以二进制形式 时 它使用DateTime ToBinary on C 为了读取 DateTime 数据 它将首
  • 类型约束

    我有以下类层次结构 class Header IEnumerable
  • 启动时的 Excel 加载项

    我正在使用 Visual C 创建 Microsoft Excel 的加载项 当我第一次创建解决方案时 它包含一个名为 ThisAddIn Startup 的函数 我在这个函数中添加了以下代码 private void ThisAddIn
  • 使用valgrind进行GDB远程调试

    如果我使用远程调试gdb我连接到gdbserver using target remote host 2345 如果我使用 valgrind 和 gdb 调试内存错误 以中断无效内存访问 我会使用 target remote vgdb 启动
  • 为什么从字典中获取时会得到 Action<> 的克隆?

    我有以下字典 private Dictionary
  • 在视口中查找 WPF 控件

    Updated 这可能是一个简单或复杂的问题 但在 wpf 中 我有一个列表框 我用一个填充数据模板从列表中 有没有办法找出特定的数据模板项位于视口中 即我已滚动到其位置并且可以查看 目前我连接到了 listbox ScrollChange
  • 等待 IAsyncResult 函数直至完成

    我需要创建等待 IAsyncResult 方法完成的机制 我怎样才能做到这一点 IAsyncResult result contactGroupServices BeginDeleteContact contactToRemove Uri
  • String.Empty 与 "" [重复]

    这个问题在这里已经有答案了 可能的重复 String Empty 和 有什么区别 https stackoverflow com questions 151472 what is the difference between string
  • 将数组作为参数传递

    如果我们修改作为方法内参数传递的数组的内容 则修改是在参数的副本而不是原始参数上完成的 因此结果不可见 当我们调用具有引用类型参数的方法时 会发生什么过程 这是我想问的代码示例 using System namespace Value Re
  • 可访问性不一致:参数类型的可访问性低于方法

    我试图在两个表单之间传递一个对象 基本上是对当前登录用户的引用 目前 我在登录表单中有一些类似的内容 private ACTInterface oActInterface public void button1 Click object s
  • 堆栈是向上增长还是向下增长?

    我在 C 中有这段代码 int q 10 int s 5 int a 3 printf Address of a d n int a printf Address of a 1 d n int a 1 printf Address of a
  • 如何在richtextbox中使用多颜色[重复]

    这个问题在这里已经有答案了 我使用 C windows 窗体 并且有 richtextbox 我想将一些文本设置为红色 一些设置为绿色 一些设置为黑色 怎么办呢 附图片 System Windows Forms RichTextBox有一个
  • 为boost python编译的.so找不到模块

    我正在尝试将 C 代码包装到 python 中 只需一个类即可导出两个函数 我编译为map so 当我尝试时import map得到像噪音一样的错误 Traceback most recent call last File
  • 灵气序列解析问题

    我在使用 Spirit Qi 2 4 编写解析器时遇到一些问题 我有一系列键值对以以下格式解析
  • 如何将十六进制字符串转换为无符号长整型?

    我有以下十六进制值 CString str str T FFF000 如何将其转换为unsigned long 您可以使用strtol作用于常规 C 字符串的函数 它使用指定的基数将字符串转换为 long long l strtol str

随机推荐

  • 使用 JavaScript 获取 div id

    这是一些 HTML div class results div something div div something else div div blah blah blah div div etc div div 现在如果我可以使用 jQ
  • 从多个 hdf5 组创建数据集

    从多个 hdf5 组创建数据集 团体代码 np array hdf get all my groups 然后我添加了用于从组创建数据集的代码 with h5py File train h5 w as hdf hdf create datas
  • SQLite 内存数据库的优点[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我今天从一本关于 SQLite 的书中读到了关键字 memory 但它只说了它是什么 如何使用 而且解释太短了 所以我在这里搜索了更多
  • React js 日期选择器的多个实例

    如果我使用日期选择器的多个实例 我在更新反应日期选择器上的日期时遇到问题 日期选择器组件
  • 在Python中快速找到给定大小的所有连通子图的方法?

    注 快速解决方案在answer https stackoverflow com a 75751315 12842085然而 需要进一步改进速度 给定一个无向稀疏连接图G with n顶点 我正在寻找一种快速的方法来找到所有连接的子图G wi
  • 使用 SSH 的 Laravel MySql 数据库连接

    我有几个想要访问的远程数据库 但它们位于只能通过 SSH 使用密钥访问的服务器上 In Sequel Pro I connect to this remote DB something like this 我将如何配置我的 Laravel
  • 如何在 WordPress 中设置动态 `home` 和 `siteurl`?

    我使用动态配置多语言设置locale筛选 其中获取子域名来确定语言 function load custom language locale get the locale code according to the sub domain n
  • 用 python 生成/合成声音?

    是否有可能让 python 生成像正弦波这样的简单声音 有可用的模块吗 如果没有 您将如何创建自己的 另外 您是否需要某种主机环境让 python 运行才能播放声音 还是可以通过从终端进行调用来实现 如果答案取决于操作系统 我使用的是 Ma
  • 特征缩放后重新缩放,线性回归

    似乎是一个基本问题 但我需要在梯度下降线性回归的实现中使用特征缩放 获取每个特征值 减去平均值 然后除以标准差 完成后 我希望将权重和回归线重新调整为原始数据 我只使用一个特征 加上 y 轴截距项 使用缩放数据获得权重后 如何更改权重 以便
  • 使用 Wiremock 进行存根 - WithBodyFile 位置除 _files 之外

    Wiremock 文档指出 在中指定的文件的位置与正文文件应该在src 测试 资源 files 我想要文件src test resources Testing ABC Testcase2 myfile xml 有什么办法可以实现这个目标吗
  • 幻灯片内容/页面过渡

    我正在尝试重新创建就像他们在 gimmebar com 上克服的那样 https gimmebar com collection 4ecd439c2f0aaad734000022 front end styleguides 单击图像时 当前
  • 查找 Python 模块的源代码

    我使用 PyCharm 作为我的编辑器 似乎它的表现不佳某些子模块 https youtrack jetbrains com issue PY 13124 namely numpy random normal 不要灰心 我找到了哪里nump
  • 自定义会员资格提供程序中的 Unity 依赖项注入

    我有 ASP NET MVC3 项目 我想在其中使用自定义成员资格提供程序 我还想使用 Unity 来解决我的依赖注入问题 这是来自 Global asax 的代码 protected void Application Start Area
  • android: singleline = true 不适用于 edittext

    我想将编辑文本条目限制为一行 但是当我添加该行时android singleline true 提示消失 输入26个字符后光标向下 这是我的 XML 代码
  • AngularJS 指令从控制器访问属性

    我正在尝试访问控制器函数中指令的属性 然而 当我访问它时 它是未定义的 我注意到如果我做一个简单的计时器它就可以工作 有没有办法仅在指令及其范围准备好并设置为使用之后才执行代码 我摆弄了它 确保您的控制台已打开 http jsfiddle
  • 将值从一种形式传递到另一种形式 (C#)

    我的程序中有一个搜索表单 当用户双击搜索表单上的 dgv 的 单元格时 我希望程序关闭该表单并跳转到主表单上的项目 我通过使用唯一的 ID 来标识每个项目来做到这一点 我正在尝试将行 id 的值传递给其他表单 问题是 它说我每次都传递零值
  • 错误:获取临时地址 [-fpermissive]

    我已经研究了这个问题几个小时 但毫无结果 基本上我有 struct rectangle int x y w h rectangle player RegionCoordinates Region Coord rectangle temp t
  • BeautifulSoup:只要进入标签内部,无论有多少个封闭标签

    我正在尝试从 中删除所有内部 html p 使用 BeautifulSoup 的网页中的元素 有内部标签 但我不在乎 我只想获取内部文本 例如 对于 p p Red p p i Blue i p p Yellow p p Light b g
  • 如何将 utf16 ushort 数组转换为 utf8 std::string?

    目前我正在编写一个插件 它只是现有库的包装器 插件的主机向我传递一个 utf 16 格式的字符串 定义如下 typedef 无符号短 PA Unichar 并且包装的库仅接受 const char 或 std string utf 8 格式
  • 使用 c++ std::unique_ptr<> 或 std::shared_ptr<> 管理 Objective-C 对象

    Objective C 可以在某种程度上与 C 混合 可以互相打电话 https stackoverflow com q 1061005 1792701 但 Objective C 对象仍然或多或少是手动管理的 并且 RAII 习惯用法在该