【问题标题】:Objective C: What is the best way to create and use a dynamic boolean array?目标 C:创建和使用动态布尔数组的最佳方法是什么?
【发布时间】: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


【解决方案1】:

问题是属性中的copy 复制了分配的对象。复制创建不可变对象。

将您的属性更改为:@property (nonatomic, retain) NSMutableArray *aShowNote;


而且我认为没有太多需要改进的地方,据我所知,如果你想要一个带有布尔值的 NSArray,这就是要走的路。

【讨论】:

    【解决方案2】:

    为什么不在这个简单的例子中使用纯 C 语言?

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

    您只需要在完成后记住free(aShow)

    【讨论】:

      【解决方案3】:

      无法更改 NSNumber 的值。它不是可变类。
      然后,当你要求两个相同的值时,返回相同的对象。

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

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

      【讨论】:

        【解决方案4】:

        我很困惑为什么每个元素都使用相同的地址进行初始化。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-03-08
          • 1970-01-01
          • 2011-03-23
          • 2022-08-04
          • 1970-01-01
          • 2013-01-12
          • 2021-09-09
          • 2010-09-05
          相关资源
          最近更新 更多