【问题标题】:Cast "const void *" to "const char *"将“const void *”转换为“const char *”
【发布时间】:2009-04-19 15:57:54
【问题描述】:

我有这样的代码:

NSData *data = [NSData dataWithContentsOfURL:objURL];
const void *buffer = [data bytes];
[self _loadData:buffer];
[data release];

“_loadData”函数接受如下参数:

- (void)_loadData:(const char *)data;

如何在 Objective-C 上将“const void ”转换为“const char”?

【问题讨论】:

  • 【数据发布】;线是不必要的。在非垃圾收集环境中,您的应用程序可能会崩溃,这表明您不完全了解 Cocoa 内存管理。仅当您明确调用 alloc、copy 或 mutableCopy(可能是我现在想不到的其他方法)时才释放。 [NSData dataWithContentsOfURL:] 返回的对象被自动释放或垃圾回收。
  • 即使在没有垃圾回收的 iPhone 上?
  • 在非垃圾收集环境中,对象被添加到自动释放池中,并且可能会在下一个事件循环或池本身被释放时被释放。在任何情况下,您都不会“拥有”返回的对象,因此如果您知道我的意思,则释放它不是您的。您只拥有通过 +alloc、-copy 或 -mutableCopy(可能还有其他方式)显式分配的对象。
  • 啊。我明白。谢谢你。 :) 我还有一些关于这个主题的阅读,但你的解释肯定有帮助。基本上,除非我明确分配或复制它,否则不要担心释放对象。

标签: objective-c casting pointers constants


【解决方案1】:

就像在 C 中一样:

[self _loadData:(const char *)buffer];

应该可以。

【讨论】:

  • 谢谢!我曾尝试将缓冲区分配给另一种类型,认为“它们只是指针,它应该可以工作”。 const char *charBuff = 缓冲区;从来没想过要投。哈!
  • 实际上也可以,除了 "const char *charBuff = (const char *)buffer;(分配给 char * 变量,你仍然需要演员)
【解决方案2】:

您不能释放数据对象,因为您没有明确分配它。另外,你可以做一个简单的演员:

[self _loadData:(const char *) buffer];

【讨论】:

  • 很好地了解 NSData。我需要阅读有关内存管理的更多信息。谢谢!
猜你喜欢
  • 1970-01-01
  • 2013-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-05
  • 1970-01-01
相关资源
最近更新 更多