【问题标题】:Can't add NSNumber object to NSMutableArray [duplicate]无法将 NSNumber 对象添加到 NSMutableArray [重复]
【发布时间】:2016-09-02 00:59:06
【问题描述】:
- (void)setToInitialStateMain
{
    [super clearBoard];

    if (_data[@"StoneOne"] != nil) {
        NSDictionary* stoneOne = _data[@"StoneOne"];
        NSNumber* c = stoneOne[@"Column"];
        NSNumber* r = stoneOne[@"Row"];
        NSInteger column = [c intValue];
        NSInteger row = [r intValue];
        [_boardCol addObject:[NSNumber numberWithInt:column]];
        [_boardRow addObject:[NSNumber numberWithInt:row]];
    }
}

所以@"StoneOne"@"Column"@"Row" 键来自NSDictionary plist 文件。当我尝试将NSNumber @"Column" 转换为NSInteger 时,一切正常。

现在,[_boardCol addObject:[NSNumber numberWithInt:column]]; 行在“列”是正确的整数 (2) 方面是可以的。但是,当在方法调用结束时设置断点以检查_boardCol(以及_boardRow)时,NSMutableArray* 两个实例变量都在读取nil。这是为什么呢?

【问题讨论】:

  • 你的两个 NSMutableArrays 都正确初始化了吗?
  • 你是什么意思?我只是将它们作为实例变量写在我的@implementation 模型文件的花括号内。那还没有初始化它们吗?
  • 不,你实际上需要在它们可以使用之前在某个地方分配和初始化它们,很可能只是在你的类的 init 方法中
  • 谢谢zfetters,你是对的......好电话
  • 后续问题:我正在尝试以另一种方法访问 _boardCol 数组的对象,但似乎无法做到这一点。方法调用来自不同的文件,而对“setToInitialStateMain”方法的调用来自同一个文件。

标签: ios objective-c nsmutablearray nsdictionary


【解决方案1】:

所有实例变量都以 nil 开头。对 nil 的方法调用返回 nil(或什么都不做)。您需要在某个时候自己实例化 NSMutableArray。这通常在 -init 或内联代码中完成,检查 ivar 是否为 nil,如果是则分配它:

if (self.boardCol == nil) {
    self.boardCol = [[NSMutableArray alloc] init];
}

如果可能涉及多个线程,上述操作并不安全。在您的 -init 方法中创建它们通常更容易。

【讨论】:

  • 效果很好....但是,当我尝试从不同的方法(由另一个文件中的另一个对象调用)访问对象时,我收到 nil。有什么想法吗?
  • 展示您如何设置对此类的访问权限。
  • 如果您的上述方法首先被调用,它将起作用;-) 这就是为什么 init 方法最简单的原因——它将在其他人可以访问它们之前实例化它们。或者,重写 getter 方法来执行上述操作,这样任何调用 getter 方法的人都会延迟创建它。
  • @Frank 我希望您已经声明了全局“_boardRow”和“_boardCol”,以便在您提到的其他类中访问它,如果您遇到错误仍然访问这些变量中的任何一个,请尝试以下操作, 1.) 确保在为变量赋值后访问该变量。 2.) 如果您仍然得到 nil 值,则按照 Carl Lindberg 在您的“viewDidLoad”方法中的回答初始化数组,那么它应该可以正常工作。
猜你喜欢
  • 2011-08-22
  • 1970-01-01
  • 2012-03-28
  • 1970-01-01
  • 1970-01-01
  • 2013-02-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多