- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
当我尝试将 C 结构存储到 NSArray 时遇到错误(我能够按照下面的链接中指定的方式转换为 NSData 来解决它)。但是,我很想知道为什么在没有使用 NSData 的所有这些麻烦的情况下它就无法工作。 link to solution I used
请注意:我不需要解决方案,它已经解决了。我只是想通过理解为什么下面的直接方法不起作用来提高我对 Objective-C 基础知识的理解。
我想做的是:一个简单的程序,允许人们添加杂货并在添加到购物车后将其标记为完成
定义包含 3 个元素的 C 结构(商品名称、数量和用于跟踪商品是否已添加到购物车的 BOOL)
每次创建新项目时,我都会执行以下操作groceryItem *secondGroceryItem = malloc(sizeof(groceryItem)) ;secondGroceryItem->itemName="啤酒";secondGroceryItem->count = 3 ;secondGroceryItem->purchased=NO ;
然后我将它添加到一个 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
不允许进入 NSArray
。 NSArray
中不允许所有原始数据类型。这甚至包括 NSInteger
和 CGFloat
,因为请记住,这些是 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/
在我的应用程序中,我必须创建这样的结构: $arrProducts = array( array( “product_id” => “1”, “qty” =>
我相信我的问题涉及指针,这是一个我经常纠结的概念,但这就是我正在尝试做的事情。 我有六个 NSArray。我想要一个由这六个数组组成的额外 NSArray,所以: self.arr1 = [NSArr
我正在使用 VKSdk 制作 iOS 应用程序.我想将数据从 response.json[@"items"](它是 nsarray,response.json 是它的 nsdictionary)复制到
我创建 NSArray *test = @[@[@1,@2,@3,@4], @[@3,@5,@6,@7]]; 这将被视为 nsarray 的 nsarray。 但是当我想用打印出来的时候 NSLog
首先引用下图: 我有一个包含 9 个元素的 NSArray。这 9 个元素中的每一个都包含另外 5 个元素。 我想做的是将 [*][1] 从每个地方带到另一个地方,只包含这些日期。 如何最好地实现这一
我正在尝试将 NSDictionaries 数组排序为基于 NSDictionary valueForKey: 第一个字母之一的字母化数组数组 实际上我想要看起来有点像这样的东西 Array A //
我有一个 NSArray 输出如下: ( { category = 1; categoryname = Random; excuse = "Enter your exc
我是 Objective-C 和 iPhone 的新手 我必须使用值对 NSDictionary 进行排序,并且根据我必须排列该值的键,我已经对数组进行了排序。 //getting values NS
我觉得这很简单,但我就是无法理解它。我有一组星期几供用户选择: NSArray * daysOfTheWeek = [NSArray arrayWithObjects:@"sunday", @"mon
我有一个 NSArray 对象: class Object { var name: String? = nil var id: String? = nil } 我想创建一个具有唯一“名
我只是想将 NSNumbers 的 NSArray 排序为数字顺序,但我不确定最好的方法。以我的思维方式,001 和 002 具有相当的可比性,所以我怀疑两者都可以。对于 003,我不确定当方法需要
我面临一个非常常见的场景。 我有一个 NSArray,它有一个自定义类型的对象,比如 Person。 Person 类具有以下属性:firstName、lastName 和 age。 如何从具有 Pe
我有一个 NSArray,其中填充了大约 30 个 NSDate 格式的日期, 我需要做的是从中创建另一个数组,其中包含从第一个日期到最后一个日期的所有日期的 bool 值。 前数组 111/1/12
NSarray 的简单问题。我将对象存储在 NSMuteableArray 中。[obj1, obj2, obj3] 如果选择了一个对象,我想把它放在数组的前面。 IE。如果选择了 obj3,则: [
我已按字母顺序存储联系人,因此我有联系人列表的数组数组,该数组已显示在屏幕上。现在我想通过姓名搜索联系人,但谓词在这里无法正常工作。我已经完成了下面的代码。 filterArray.filter
对于使用 ARC 的 iOS 5.0 应用程序,我有一个对象的 NSArray,其中包含其他对象的 NSArray。是否可以在不遍历数组的情况下从内部数组中提取对象列表,例如比如,使用 NSPredi
这个问题在这里已经有了答案: Sort NSArray of custom objects based on sorting of another NSArray of strings (5 个答案
我有一个 NSArray 对象,每个对象都包含一个“键”字段 我有另一个带有嵌套NSArrays的NSArray,通过不同的字段“按字段分组”对这些对象进行分组,例如显示名称(字母分组) 例如 @in
我正在尝试在多个 NSArray 中搜索和合并对象。 基本上 NSArray 具有多个 NSArray 和 1 个对象,然后是 NSDictionary。我想检查该对象是否已经存在并将其与现有对象合并
这个问题在这里已经有了答案: Check that the contents of one NSArray are all in another array (9 个回答) 关闭 8 年前。
我是一名优秀的程序员,十分优秀!