【发布时间】:2010-10-29 07:53:32
【问题描述】:
一个多星期以来,我一直在努力寻找从动态布尔数组创建、访问和更新值的最佳方法。
@interface myDelegate : NSObject
{
NSMutableArray *aShowNote;
}
@property (nonatomic, copy) NSMutableArray *aShowNote;
这就是我初始化数组的方式:
NSMutableArray *aShow = [[NSMutableArray alloc] init];
for (i=0; i < c; i++)
[aShow addObject:[NSNumber numberWithBool:false]];
self.aShowNote = aShow;
这似乎工作正常,但我很困惑为什么每个元素都使用相同的地址进行初始化。
但是到目前为止,我在研究中发现的是,如果要更改对象的值,似乎需要替换对象:
myDelegate *appDelegate = (myDelegate *)[[UIApplication sharedApplication] delegate];
NSInteger recordIndex = 1;
NSNumber *myBoolNo = [appDelegate.aShowNote objectAtIndex:recordIndex];
BOOL showNote = ![myBoolNo boolValue];
[appDelegate.aShowNote replaceObjectAtIndex:recordIndex withObject:[NSNumber numberWithBool:showNote]];
但这种方法似乎过于复杂(而且它也会崩溃)。
由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:'-[__NSArrayI replaceObjectAtIndex:withObject:]:无法识别的选择器发送到实例 0x5b51d00
我们将不胜感激地收到任何改进此代码(当然还有使其工作)的指针。
谢谢
伊帕奥
【问题讨论】:
-
关于所有具有相同地址的条目令人困惑的问题:由于
NSNumber是不可变的,因此给定值只需要一个对象。对于一些常见的值,从一开始就预先分配了一些对象。每次您调用numberWithBool:false时,它只会让您返回对现有实例的另一个引用。 (顺便说一句,微不足道,但NO会比false更惯用。)
标签: objective-c arrays xcode nsmutablearray boolean