【发布时间】: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