【问题标题】:C/Java/etc. style arrays in Objective-CC/Java/等。 Objective-C 中的样式数组
【发布时间】:2012-04-04 04:48:55
【问题描述】:

我知道 Apple 非常重视让您使用 NS 对象而不是真正的原始类型,但我需要数组的功能(即直接访问索引处的项目)。然而,他们似乎非常热衷于使用NS 对象,以至于我在网上或教科书中找不到关于如何使用基本原始数组的教程。 我想要在 Java 中做这样的事情

String inventory[] = new String[45];

inventory[5] = "Pickaxe";
inventory[12] = "Dirt";
inventory[8] = "Cobblestone";

inventory[12] = null;

System.out.println("There are " + inventory.length + " slots in inventory: " + java.util.Arrays.toString(inventory));

以下是我在 Objective-C 中得到的最接近的,但它不能正常运行:

NSString *inventory[45];

inventory[5] = @"Pickaxe";
inventory[12] = @"Dirt";
inventory[8] = @"Cobblestone";

inventory[12] = nil;

NSArray *temp = [NSArray arrayWithObjects:inventory count:45];
NSLog(@"There are %i slots in inventory: %@", [temp count], [temp description]);

另外,如果可能的话,O-C 中是否有一些东西可以让我计算数组中非空/非零对象的数量? (这样,我就可以知道物品栏中还剩下多少空间,这样玩家就无法打包任何东西了)

【问题讨论】:

  • 它不起作用是很自然的。 [NSArray arrayWithObjects:inventory];将要求inventory 是可变参数的列表。用户 [NSArray arrayWithObjects:count:] 代替。
  • 不要忘记,objective-c 是建立在 C 之上的,因此任何标准的 C 代码都可以工作。如果您不确定如何使用,只需搜索 C 数组的示例即可。
  • @H2CO3 谢谢你!但是,在其中放置 nil 值仍然会引发异常
  • 那是你的错!集合对象do 在获得nil 时抛出异常,并且记录了此行为。在将 nil 传递给初始化方法之前,您应该检查它。

标签: objective-c arrays data-structures nsarray primitive


【解决方案1】:

通常,您会使用 NSArray/NSMutableArray,但您也可以使用 C 数组。

NSArray(和大多数 Foundation 集合)不能包含 nil 条目 - 如果您需要 nil 值,您可以使用 NSPointerArray (OS X),或者只需在 NSArray 中使用 [NSNull null] 来指定nil.

这是您使用 NSArray 的程序:

NSMutableArray * inventory = [NSMutableArray array];
for (NSUInteger idx = 0; idx < 45; ++idx) {
  [inventory addObject:[NSNull null]];
}

[inventory replaceObjectAtIndex:5 withObject:@"Pickaxe"];
[inventory replaceObjectAtIndex:12 withObject:@"Dirt"];
[inventory replaceObjectAtIndex:8 withObject:@"Cobblestone"];

[inventory replaceObjectAtIndex:12 withObject:[NSNull null]];

NSArray *temp = [NSArray arrayWithObject:inventory];
NSLog(@"There are %i slots in inventory: %@", [temp count], [temp description]);

另外,如果可能的话,O-C 中是否有一些东西可以让我计算数组中非空/非零对象的数量?

NSArray 是 CFArray - 它们是“免费桥接”。使用CFArrayGetCountOfValue[NSNull null] 作为要查找的值。大多数 CF-API 在 NS-API 中可用,但不是这个。如果经常需要,您可以轻松地将其包装在一个类别中。

【讨论】:

  • 当它尝试创建NSArray 时,它会显示Program received signal: EXC_BAD_ACCESS. 并退出。
  • @Supuhstar 啊-我错过了。更新。那是从原来的。你想要arrayWithObject:,而不是arrayWithObjects:。你需要 nil-terminate arrayWithObjects:,像这样:NSArray *temp = [NSArray arrayWithObjects:inventory, nil];
  • 太棒了!我要使用这个系统,现在:3
【解决方案2】:

使用 c 风格的数组。任何 c 代码都可以在目标 c 中工作。除非您非常小心,否则尽量不要将客观的 c 样式对象与 c 样式代码混合。内存管理的东西变得很奇怪,而且很容易混淆对象类型和原语。

【讨论】:

  • ...所以去读一本书,或者谷歌“C 数组教程”? SO 不是让人们亲自教你材料的地方,你可以轻松地自己研究。
  • 我只是想要一个 sn-p,jeeze >.> 如果有人要我提供 Java、HTML、CSS、VB 等代码的示例,我很乐意写出来。跨度>
猜你喜欢
  • 2012-08-23
  • 1970-01-01
  • 1970-01-01
  • 2012-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
  • 2011-11-01
相关资源
最近更新 更多