目标C:创建和使用动态布尔数组的最佳方法是什么?

时间:2010-10-29 07:53:32

标签: objective-c arrays xcode nsmutablearray boolean

我一直在努力创建,访问和更新动态布尔数组中的值超过一周的最佳方法。

@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

4 个答案:

答案 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。