【问题标题】:Storing a C struct in CFMutableDictionary在 CFMutableDictionary 中存储 C 结构
【发布时间】:2009-07-29 23:54:06
【问题描述】:

既然 Core Foundation 中没有 NSValue 的对应物,我们应该如何将 C 结构存储在 CFMutableDictionary 中?

【问题讨论】:

    标签: iphone objective-c core-foundation


    【解决方案1】:

    首先,您可以按原样将 NSvalue 放入 CFMutableDictionary,因此答案是“使用 NSValue”。但我认为您的其余问题是“不使用任何 Cocoa 对象”。在这种情况下,只需创建一个非保留 CFMutableDictionary,您就可以将任何您想要的指针放入其中。有关一些示例代码,请参阅"Defining Custom Collection Callbacks"。我经常使用这些。

    请记住,这些仍然必须是指针,因此您必须在堆上分配结构,而不是在堆栈上。这意味着内存管理现在是您的问题。当然,您可以创建一组自定义回调来执行您想要的任何操作,因此如果您使用 boost 或其他具有自己的引用计数系统的东西,您仍然可以使用 CFMutableDictionary 来实现它。

    当然你可以用一个小的数据对象来替换这个结构。这通常要容易得多。但不同的问题需要不同的解决方案。

    【讨论】:

    • 谢谢罗伯!正是我想要的:非保留字典。
    • 另一种选择是通过 CFData 对象传递结构。 API 并没有完全针对这种用法量身定制,并且您会失去 NSValue 提供的字节序感知方面,但我没有看到许多其他缺点。从某种意义上说,NSValue 和 NSData 都存储“原始字节”的副本。 NSValue 只是跟踪一些额外的元数据,这对于许多目的——即通过 CF 集合类在内存中传递结构——可能是不必要的。因此,与其将值类型添加为 NSValue 上的类别,不如将一些辅助函数写入 CFDataRef 或从 CFDataRef 写入?
    【解决方案2】:

    CFMutableDictionary

    CFDictionaryAddValue 要添加到字典中的 CFType 对象或指针值。

    你只需传递一个指向你的结构的指针。

    【讨论】:

    • 哇,我绝对应该仔细看看这些文件。我必须提供自定义回调还是可以按原样使用它?
    • 当指向结构的指针被传递给默认的保留方法时,这将崩溃,该方法需要一个 CFType。您必须重载回调才能使其正常工作。
    猜你喜欢
    • 2011-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-27
    • 2014-06-10
    • 1970-01-01
    • 2021-11-27
    • 1970-01-01
    相关资源
    最近更新 更多