【发布时间】:2013-03-28 00:51:03
【问题描述】:
我有一种情况,我希望能够维护一个可能都指向 nil 的指针数组。
Equipment *equipment[19];
但是,我发现我无法将指针数组或双指针设置为对象的属性。
当我不能使用 C 样式数组时,我的解决方法是使用 NSArray 对象。因此,我尝试执行以下操作:
NSMutableArray *equipment = [NSMutableArray arrayWithCapacity: NUM_EQUIPSLOTS];
for (int i=0; i<NUM_EQUIPSLOTS; i++) {
[equipment setObject: nil atIndexedSubscript: i];
}
这里的想法是我有一个空指针数组,稍后将指向东西。
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[__NSArrayM insertObject:atIndex:]: object cannot be nil'
*** First throw call stack:
(0x246e012 0x1e4be7e 0x2421b6a 0x2421a20 0xebd02 0xde82b 0xc9d5a 0xcb6bd 0x4d525 0xc94fa 0xc8b6a 0xa18157 0xa18747 0xa1994b 0xa2acb5 0xa2bbeb 0xa1d698 0x3176df9 0x3176ad0 0x23e3bf5 0x23e3962 0x2414bb6 0x2413f44 0x2413e1b 0xa1917a 0xa1affc 0xc8526 0x1fa5)
libc++abi.dylib: terminate called throwing an exception
我知道我可以使用 C 风格的数组和单个对象轻松地做到这一点。我宁愿这样做而不是像这样愚蠢的事情:
Equipment *equipment0 = nil;
Equipment *equipment1 = nil;
Equipment *equipment2 = nil;
// ...
Equipment *equipment18 = nil;
这可能与 NSArray 模型本身的结构有关。有人会向我解释为什么会这样,以及为什么我不能简单地在 NSArray 中添加或设置 nil 对象吗?提前谢谢你。
【问题讨论】:
-
使用 NSNull 模拟 nil,或者使用 NSPointerArray 模拟集合中的实际 NULL。
-
如果您正在为 iOS6+ 或 OS X 10.5+ 编写代码,那么可以考虑使用 NSPointerArray。 developer.apple.com/library/mac/#documentation/Cocoa/Reference/…
-
如果你想知道为什么,反编译Core Foundation,看看CFArray在向自身添加对象时做了什么。如果你能通过足够多的内联 asm 和晦涩难懂的 CF 函数,你就会明白为什么。
-
@CodaFi 实际上,我完全可以这样做!最后,我已经解决了我遇到的问题,但是为了真正回答我的问题,我必须完全按照你的建议去做。谢谢指导! :)
-
没有理由反编译 Core Foundation。其中大部分是开源的。 opensource.apple.com/source/CF/CF-744.12/CFArray.c
标签: objective-c c nsmutablearray nsarray null