[英]Objective C: What is the best way to create and use a dynamic boolean array?
超过一个星期以来,我一直在努力尝试从动态布尔数组创建,访问和更新值的最佳方法。
@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
我们将非常感激收到任何改进此代码(以及使其正常工作)的指针。
谢谢
伊法
问题是, copy
的属性副本分配的对象。 复制会创建不可变的对象。
将属性更改为: @property (nonatomic, retain) NSMutableArray *aShowNote;
而且我认为没有太多改进,据我所知,如果要使用带布尔值的NSArray,这是要走的路。
为什么不为这种简单情况使用普通C?
BOOL *aShow = malloc(sizeof(BOOL)*c);
for (i=0 ; i<c ; i++)
aShow[i] = false;
您只需要记住在完成后free(aShow)
。
不能更改NSNumber的值。 它不是可变的类。
然后,当您要求两个相同的值时,将返回相同的对象。
在数组初始化中,为什么不直接初始化数组以避免复制问题:
aShowNote = [[NSMutableArray alloc] init];
for (i=0; i < c; i++) {
[aShowNote addObject:[NSNumber numberWithBool:false]];
}
我很困惑为什么每个元素都用相同的地址初始化。
为什么? NSNumber是不可变的。 运行时仅需要一个NSNumber对象即可代表FALSE。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.