NSMutableArray addObject返回nil

时间:2015-09-23 19:16:14

标签: ios objective-c nsmutablearray nsarray

StackOverflow上已经存在一些类似的问题。我确实检查了它们,并且在大多数情况下它返回nil,因为NSMutableArray尚未初始化。但在我的情况下,我做了初始化。

这是我的代码的一部分:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    self.storedTimeZones = [[NSMutableArray alloc] init];
    NSData *storedData = [[NSUserDefaults standardUserDefaults] dataForKey:@"timeZones"];

    if (storedData != nil ) {
        self.storedTimeZones = [NSKeyedUnarchiver unarchiveObjectWithData:storedData];
    }

    NSString *str = [self.smallRegionArray[indexPath.row] stringByReplacingOccurrencesOfString:@"_" withString:@" "];
    [self.storedTimeZones addObject: str];
    NSLog(str); //the string was printed successfully.
    NSLog(@"%lu", (unsigned long)self.storedTimeZones.count); //'0' was printed
}

更新 @Caleb是对的,[NSKeyedUnarchiver unarchiveObjectWithData:storedData返回零。我解决了这个问题:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    self.storedTimeZones = [[NSMutableArray alloc] init];
    NSData *storedData = [[NSUserDefaults standardUserDefaults] dataForKey:@"timeZones"];
    NSMutableArray *ary = [NSKeyedUnarchiver unarchiveObjectWithData:storedData];

    if (ary != nil ) {
        self.storedTimeZones = ary;
    }

    NSString *str = [self.smallRegionArray[indexPath.row] stringByReplacingOccurrencesOfString:@"_" withString:@" "];
    [self.storedTimeZones addObject: str];
    NSLog(str);
    NSLog(@"%lu", (unsigned long)self.storedTimeZones.count); //Now it prints `1`
}

2 个答案:

答案 0 :(得分:6)

  

但在我的情况下,我做了初始化。

你做了,但后来你取而代之。这是初始化行:

self.storedTimeZones = [[NSMutableArray alloc] init];

但是你分配了一个不同的值:

self.storedTimeZones = [NSKeyedUnarchiver unarchiveObjectWithData:storedData];

此时,self.storedTimeZones可能是NSArray的不可变实例,也可能是某些完全不同的对象,或nil。我猜它是后者,因为当你拨打-addObject:时没有抛出异常。如果countself.storedTimeZones,则nil为0也是有意义的,因为消息nil的结果为nil0或{{ 1}},取决于您期望的类型。

要正确诊断问题,您真正需要做的就是检查上一个NO语句附近的self.storedTimeZones。设置断点并查看该属性的内容。有用的命令是:

NSLog

答案 1 :(得分:1)

您尝试将对象分配给整个可变数组,但您并未向其添加对象。

这不是它的工作方式。

试试这个:

[self.storedTimeZones addObject: [NSKeyedUnarchiver unarchiveObjectWithData:storedData]];

或者这个

[self.storedTimeZones addObjectsFromArray:[NSKeyedUnarchiver unarchiveObjectWithData:storedData]];

或者这个

self.storedTimeZones = [NSArray alloc]; // Note: not a mutable array [self.storedTimeZones initWithArray:[NSKeyedUnarchiver unarchiveObjectWithData:storedData]];

你从来没有告诉过我们keyedUnarchiver的内容是否是一个数组,但我们期望它是。

在任何一种情况下,如果这是您向阵列添加信息的唯一时间,则不需要将其设为可变。

祝你好运。