【问题标题】:Cannot reset NSArray and NSMutableArray in Objective-C无法在 Objective-C 中重置 NSArray 和 NSMutableArray
【发布时间】:2011-11-29 15:57:23
【问题描述】:

我创建一个NSMutableArray如下(注意winner是一个实例变量):

winner = [NSMutableArray arrayWithObjects:@"11", @"12", @"13", nil];

当我将winner 设置为nil 或删除它的对象时

[self.winner removeAllObjects];

我的程序将自动关闭。我该如何解决这个问题?

更新了!!! 如果我这样编码

self.winner = [NSMutableArray arrayWithObjects:@"11", @"12", @"13", nil];

它会调用setter方法

- (void)setWinner:(NSMutableArray *)newWinner
{
    [winner release];
    winner = [newWinner retain];
}

我还需要像这样保留数组吗

self.winner = [[NSMutableArray arrayWithObjects:@"11", @"12", @"13", nil] retain];

【问题讨论】:

    标签: objective-c nsmutablearray nsarray


    【解决方案1】:

    您是否以不同的方式调用-removeAllObjects?如果是这样,那么问题很可能是您未能保留该数组,并且它已在分配和您以后的引用之间被破坏。 +arrayWithObjects 返回一个已调用 autorelease 的实例。

    要么使用综合属性设置实例变量,要么使用返回对象所有权的方法(如+alloc),或者添加retain 调用:

    winner = [[NSMutableArray arrayWithObjects:@"11", @"12", @"13", nil] retain];
    

    【讨论】:

      【解决方案2】:

      你没有分配数组

      很喜欢,

      winner = [[NSMutableArray alloc] initWithArray:@"11", @"12", @"13", nil];
      

      【讨论】:

      • 数组是通过调用arrayWithObjects:...分配的。
      【解决方案3】:

      您为实例变量分配了一个自动释放的引用,因此它在事件循环后被释放。创建后保留它:

      winner = [[NSMutableArray arrayWithObjects:@"11", @"12", @"13", nil] retain];
      

      【讨论】:

        【解决方案4】:

        您的程序并没有因为您在那里显示的内容而关闭,它没有任何问题。向我们展示您收到的错误代码以及是否引发了异常,并在发生崩溃的位置发布更多代码。

        【讨论】:

          猜你喜欢
          • 2021-05-14
          • 2015-08-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-11-07
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多