【问题标题】:objC - empty array of typesobjC - 类型的空数组
【发布时间】:2011-02-16 14:37:35
【问题描述】:

在 C、C++、C# 中,您可以拥有某种类型的数组,例如 int[]。 在 objC 中,一个 NSArray 可以为每个元素具有不同的类型。 如果你想要一个 x 类型的 NSArray,你现在可以将索引 0 处元素的类型视为数组的类型,这意味着如果 [anArray objectAtIndex:0] 是一个 NSString,你将所有对象都视为一个 NSString 并且如果任何元素的类型与索引 0 处的元素的类型不同,则抛出错误。这很难看,但您可以通过这种方式模拟类型化数组。 现在,在 C# 中,甚至可以有一个 x 类型的空数组,其中包含 0 个元素。 然而,一个空的 NSArray 当然没有元素,甚至在索引 0 处也没有,所以那里没有 typeinfo。

现在,如果 objC 应用程序从 C# 应用程序获取数组,反之亦然,并且 C# 应用程序在某些情况下发送或期望一个空数组,接收方必须知道类型,如何获取/设置此类型信息对象?

当然我可以使用 C-arrays 而不是 NSArrays,但是如果你想将 c-arrays 存储在 NSDictionary 中,你必须先将它放入 NSValue 并且 NSValue 不提供存储大小的可能性动态分配的 c 数组。

有没有比实现一个新类“CArrayValue”更好的选择,用于在 NSDictionary 中存储具有 typeinfo 和 size 的 C_Arrays?

【问题讨论】:

  • 使用第一个元素的类型不是一个好计划;例如,如果您要存储 NSString,第一个可能是 NSString 的(私有)子类,如 NSCFString,其他可能是 NSString 的其他子类。您应该如何知道要执行的超类?您需要将此信息存储在其他地方。
  • 你可以在一个对象上使用[NSObject isMemberOfClass]来检查它是否是NSString的某个子类的一个实例,但是你也可以使用[NSObject isKindOfClass]来找出它是否是一个NSString 的任何子类的实例。
  • Graham Lee 就该主题写了一篇不错的博文:On type safety and making it harder to write buggy code

标签: objective-c cocoa


【解决方案1】:

为 NSArray 制作一个包装器,它包含一个类型键作为实例变量和一个 NSArray。这样,您应该能够轻松控制数组的类型。此外,您可以做些什么来防止添加不允许的类型,即编写一些方法来删除/添加项目到数组/初始化它。

【讨论】:

  • 似乎是一种合适的方法,但为什么是包装器而不是子类?
  • @Kaiserludi NSArray 实际上是一个类的集群,任何 NSArray 的子类基本上都要自己实现基本的数组操作(count,objectAtIndex:),也就是说提供自己的存储机制和内存管理。通过包装 NSArray,您可以跳过该部分并执行您的约束。
  • 啊,在输入链接文本之前我不应该点击回车:刚刚在这里查看了部分子类集群,我认为是一个复合对象,它通过包装类集群和然后覆盖原始方法来调用嵌入对象的方法是合适的,因为您不必包装所有API,但可以继承方法,您不需要覆盖,并且这种方式具有子类化的优点,但仍然具有无需实现自己的存储的包装器优势
  • 另见:[何时创建子类][1]。我会第二(或第三)组合而不是子类化的想法。请参阅NSAttributedString,它是使用组合实现的,而不是通过子类化NSString。 [1]:developer.apple.com/library/mac/documentation/Cocoa/Conceptual/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-01
  • 1970-01-01
  • 2020-03-20
  • 1970-01-01
  • 2011-06-13
  • 1970-01-01
相关资源
最近更新 更多