【发布时间】:2015-01-26 14:39:43
【问题描述】:
我在尝试将 C 结构存储到 NSArray 时遇到了一个错误(我能够通过转换为 NSData 来解决它,如下面的链接中指定的那样)。但是,我很想知道为什么如果没有使用 NSData 的所有麻烦,它就无法工作。 link to solution I used
请注意:我不想要解决方案,它已经解决了。我只是想通过理解为什么下面的直接方法不起作用来提高我对 Objective-C 基础知识的理解。
我想做的是:一个简单的程序,允许人们添加杂货商品并在添加到购物车后将其标记为已完成
用 3 个元素定义 C 结构(项目名称、计数和 BOOL 以跟踪它是否已添加到购物车)
每次创建新项目时,我都会执行以下操作 杂货项目 *secondGroceryItem = malloc(sizeof(groceryItem)) ; secondGroceryItem->itemName="Beer" ; secondGroceryItem->count = 3 ; secondGroceryItem->purchased=NO ;
然后我将它添加到 NSMutableArray 中,使用 [myGroceryList addObject:(__bridge id)(secondGroceryItem)]
myGroceryList 在前面定义为 NSMutableArray *myGroceryList = [NSMutableArray 数组] ;
这不起作用。在存储到 NSMutableArray 之前,我必须转换为 NSData。为什么我不能直接在 NSMutableArray 中存储指向我的 C 结构的指针?
【问题讨论】:
-
C 结构不是 NSObject。只有 NSObject pointers 可以存储在 NSArrays 中。您可以(在某些情况下)使用 NSValue 作为 C 结构的“容器”。可能比一些 NSData kluge 更好,但仍然有点不稳定。 (而且几乎没有什么情况下你需要使用 C 结构,除非你正在做一些非常奇怪的事情。)
-
我不确定这个问题是否真的可以回答。简单的答案是,正如 Hot Licks 所说,“因为
NSArray只能存储对象”。更复杂的答案意味着要回到 NeXT 工程师 20 多年前做出的决定。无论如何,推荐的解决方案是将您的结构转换为简单的数据类,将字段变成属性。 -
我们也不能在
NSArray中放入整数、浮点数、字符等。NSArray是一种特殊类型的 Objective-C 对象数组。
标签: objective-c c