gpt4 book ai didi

objective-c - 为什么我们不能直接在 NSArray 中存储 C 结构

转载 作者:太空宇宙 更新时间:2023-11-04 00:18:11 24 4
gpt4 key购买 nike

当我尝试将 C 结构存储到 NSArray 时遇到错误(我能够按照下面的链接中指定的方式转换为 NSData 来解决它)。但是,我很想知道为什么在没有使用 NSData 的所有这些麻烦的情况下它就无法工作。 link to solution I used

请注意:我不需要解决方案,它已经解决了。我只是想通过理解为什么下面的直接方法不起作用来提高我对 Objective-C 基础知识的理解。

我想做的是:一个简单的程序,允许人们添加杂货并在添加到购物车后将其标记为完成

  1. 定义包含 3 个元素的 C 结构(商品名称、数量和用于跟踪商品是否已添加到购物车的 BOOL)

  2. 每次创建新项目时,我都会执行以下操作groceryItem *secondGroceryItem = malloc(sizeof(groceryItem)) ;secondGroceryItem->itemName="啤酒";secondGroceryItem->count = 3 ;secondGroceryItem->purchased=NO ;

  3. 然后我将它添加到一个 NSMutableArray 中,使用[myGroceryList addObject:(__bridge id)(secondGroceryItem)]

myGroceryList 之前定义为 NSMutableArray *myGroceryList = [NSMutableArray 数组] ;

这是行不通的。在存储到 NSMutableArray 之前,我必须转换成 NSData。为什么我不能直接在 NSMutableArray 中存储指向我的 C 结构的指针?

最佳答案

应该注意的是,我们不能将 C 结构放入 NSArray 的原因并不是因为结构有任何特殊之处。相反,我们应该将 NSArray 视为一种特殊类型的数组。

我们可以在 Objective-C 中将结构放入数组中。我们知道这一点是因为 C 程序员将结构放在数组中。

NSArray(以及NSMutableArray 和所有其他NS 集合对象)是一个特殊的类,旨在实现专门针对 Objective 的数组数据结构-C 对象。 NSArray 仅允许 Objective-C 对象这一事实允许 NSArray 执行类似 makeObjectsPerformSelector: 的操作。我们正在向数组中的所有内容发送一条 Objective-C 消息。如果我们允许非 Objective-C 对象进入数组,我们就不能允许这样做。

不仅仅是 structs 不允许进入 NSArrayNSArray 中不允许所有原始数据类型。这甚至包括 NSIntegerCGFloat,因为请记住,这些是 typedef 的基元——而不是对象。

但是应该注意的是,NSArray 并不是我们在 Objective-C 中唯一可用的类数组数据结构。请记住,Objective-C 是 C 的严格超集。正如我已经提到的,C 程序员已经将结构放入数组中。

我们总是可以使用 C 风格的数组。事实上,虽然很少有人这样做(因为 Objective-C 数组的强大功能),但我们甚至可以创建一个 C 风格的 Objective-C 对象数组。

考虑:

NSString *stringArray[3];
stringArray[0] = @"foo";
stringArray[1] = @"bar";
stringArray[2] = @"baz";

for (int i = 0; i < 3; ++i) {
NSLog(@"%@", stringArray[i]);
}

这会编译、运行并执行您在 Objective-C 中所期望的操作。因此,我们可以对 struct 执行完全相同的操作:

typedef struct Foo {
int x;
int y;
} Foo;

Foo fooArray[3];
fooArray[0] = (Foo){.x = 1, .y = 2};
fooArray[1] = (Foo){.x = 3, .y = 4};
fooArray[2] = (Foo){.x = 5, .y = 6};

for (int i = 0; i < 3; ++i) {
NSLog(@"Foo(x: %i, y: %i)", fooArray[i].x, fooArray[i].y);
}

同样,这是完全有效的 Objective-C 代码。

你必须问自己的问题:是拥有一个结构并处理 C 风格的数组更好,还是我的结构作为一个对象更好,我可以将它放入 NSArray ?我不会使用正在转换为 NSData 并返回的 struct 只是为了将其放入 NSArray...看起来一团糟。

关于objective-c - 为什么我们不能直接在 NSArray 中存储 C 结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27180152/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com