目标C:什么是创建和使用动态布尔型数组的最佳方式?(Objective C: What is the

2019-11-04 08:29发布

我一直在挣扎与创建,访问和从动态布尔数组一个多星期,现在更新价值的最佳途径。

@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]];

但这种方法只是似乎过于复杂(和它崩溃过)。

终止应用程序由于未捕获exception'NSInvalidArgumentException '原因:' - [__ NSArrayI replaceObjectAtIndex:withObject:]:无法识别的选择发送到实例0x5b51d00

任何指针,以改善这些代码(当然,使其工作)将是非常感激地接受。

谢谢

Iphaaw

Answer 1:

问题是, copy的属性副本分配的对象。 而副本创建不可改变的对象。

更改属性来读取: @property (nonatomic, retain) NSMutableArray *aShowNote;


而且我觉得没有太大改善,从我知道这是去,如果你想要一个NSArray与布尔值的方式。



Answer 2:

为什么不使用普通的C为这个简单的例子?

BOOL *aShow = malloc(sizeof(BOOL)*c);
for (i=0 ; i<c ; i++)
    aShow[i] = false;

你只需要记住free(aShow) ,当你用它做。



Answer 3:

这是不可能改变的NSNumber的价值。 它不是可变类。
然后,当你问了两个值相同,相同的对象是回报。

在你的数组初始化,你为什么不直接初始化数组以避免拷贝问题:

aShowNote  = [[NSMutableArray alloc] init]; 
for (i=0; i < c; i++) {
    [aShowNote addObject:[NSNumber numberWithBool:false]];
}


Answer 4:

我很困惑,为什么每个元素与同一地址初始化。

为什么? NSNumbers是不可改变的。 运行时只需要一个NSNumber的对象来表示FALSE。



文章来源: Objective C: What is the best way to create and use a dynamic boolean array?