我一直在努力创建,访问和更新动态布尔数组中的值超过一周的最佳方法。
@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
非常感谢收到改进此代码的任何指示(当然也是为了使其成功)。
由于
Iphaaw
答案 0 :(得分:3)
问题是属性中的copy
会复制指定的对象。并且copy会创建不可变对象。
将您的媒体资源改为:@property (nonatomic, retain) NSMutableArray *aShowNote;
我认为没有太大的改进,据我所知,如果你想要一个带有布尔的NSArray,这就是要走的路。
答案 1 :(得分:2)
为什么不在这个简单的情况下使用普通的C?
BOOL *aShow = malloc(sizeof(BOOL)*c);
for (i=0 ; i<c ; i++)
aShow[i] = false;
完成后,您必须记住free(aShow)
。
答案 2 :(得分:1)
无法更改NSNumber的值。它不是可变类 然后,当您要求两个相同的值时,将返回相同的对象。
在您的数组init中,为什么不直接初始化数组以避免复制问题:
aShowNote = [[NSMutableArray alloc] init];
for (i=0; i < c; i++) {
[aShowNote addObject:[NSNumber numberWithBool:false]];
}
答案 3 :(得分:0)
我很困惑为什么每个元素都用相同的地址初始化。
为什么呢? NSNumbers是不可变的。运行时只需要一个NSNumber对象来表示FALSE。