NSMutableArray addObject returns 无
NSMutableArray addObject returns nil
Whosebug 上已经存在一些类似的问题。我确实检查了它们,在大多数情况下它 returns 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`
}
But in my case I did initialise it.
你做到了,但后来你替换了它。这是初始化行:
self.storedTimeZones = [[NSMutableArray alloc] init];
但是你分配了一个不同的值:
self.storedTimeZones = [NSKeyedUnarchiver unarchiveObjectWithData:storedData];
此时,self.storedTimeZones
可能是 NSArray
的不可变实例,或者一些完全不同的对象,或者 nil
。我猜是后者,因为调用 -addObject:
时不会抛出异常。如果 self.storedTimeZones
为 nil
,则 count
为 0 也有意义,因为消息 nil
的结果为 nil
或 0
或 NO
,取决于你期望的类型。
要正确诊断问题,您真正需要做的就是检查最后一个 NSLog
语句附近的 self.storedTimeZones
。设置一个断点并查看属性的内容。有用的命令是:
po self.storedTimeZones
po [self.storedTimeZones class]
您正在尝试将对象分配给整个可变数组,而不是向其添加对象。
这不是它的工作方式。
试试这个:
[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 的内容是否为数组,但我们预计它是。
无论哪种情况,如果这是您唯一一次向数组添加信息,则无需将其设为可变。
祝你好运。
Whosebug 上已经存在一些类似的问题。我确实检查了它们,在大多数情况下它 returns 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`
}
But in my case I did initialise it.
你做到了,但后来你替换了它。这是初始化行:
self.storedTimeZones = [[NSMutableArray alloc] init];
但是你分配了一个不同的值:
self.storedTimeZones = [NSKeyedUnarchiver unarchiveObjectWithData:storedData];
此时,self.storedTimeZones
可能是 NSArray
的不可变实例,或者一些完全不同的对象,或者 nil
。我猜是后者,因为调用 -addObject:
时不会抛出异常。如果 self.storedTimeZones
为 nil
,则 count
为 0 也有意义,因为消息 nil
的结果为 nil
或 0
或 NO
,取决于你期望的类型。
要正确诊断问题,您真正需要做的就是检查最后一个 NSLog
语句附近的 self.storedTimeZones
。设置一个断点并查看属性的内容。有用的命令是:
po self.storedTimeZones
po [self.storedTimeZones class]
您正在尝试将对象分配给整个可变数组,而不是向其添加对象。
这不是它的工作方式。
试试这个:
[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 的内容是否为数组,但我们预计它是。
无论哪种情况,如果这是您唯一一次向数组添加信息,则无需将其设为可变。
祝你好运。