Ios NSArray已从数组填充尝试插入nil对象
我尝试从现有填充数组填充数组,但有时会出现以下错误:Ios NSArray已从数组填充尝试插入nil对象,ios,nsarray,Ios,Nsarray,我尝试从现有填充数组填充数组,但有时会出现以下错误: *** -[__NSPlaceholderArray initWithObjects:count:]: attempt to insert nil object from objects[4830] 此代码行导致的异常: NSArray *result = [NSArray arrayWithArray:self.testerLog]; testerLog是NSMutableArray,我使用它从应用程序收集日志。 下一步填写测试人员日
*** -[__NSPlaceholderArray initWithObjects:count:]: attempt to insert nil object from objects[4830]
此代码行导致的异常:
NSArray *result = [NSArray arrayWithArray:self.testerLog];
testerLog是NSMutableArray,我使用它从应用程序收集日志。
下一步填写测试人员日志:
[self.testerLog addObject:[NSString stringWithFormat:@"%@: %@ \n", [NSDate date], logRecord]];
这怎么会发生?将对象添加到testerLog时没有异常,尝试从此填充数组填充数组时失败
编辑:
关于初始化testerLog。以下是testerLog方法的代码:
- (NSMutableArray *)testerLog {
if (!_testerLog) {
_testerLog = [NSMutableArray array];
}
return _testerLog;
}
所以我认为它不应该是零
更新:
我忘了说将NSString添加到testerLog的方法可以从多个线程调用 确保正确初始化了testerLog数组。这是零,这就是你的问题所在
addObject可能没有引发错误,因为您正在尝试向testerLog数组添加有效的NSString。尝试在添加对象的行之后立即在self.testerLog上执行NSLog,并查看它是否按照预期正确打印了testerLog数组。您发布的getter不是线程安全的。要获得等效的线程安全getter,请使用以下代码
-(NSMutableArray *)testerLog {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
// If you're not using ARC you most definitely want to retain the array!
// _testerLog = [[NSMutableArray array] retain];
// If you're using ARC you should just assign
_testerLog = [NSMutableArray array];
});
return _testerLog;
}
dispatch_once调用确保无论您在其中输入什么代码,它在应用程序的生命周期内都只执行一次(以线程安全的方式)。静态onceToken
标识特定块。在您的特定情况下,这是非常有用的,因为它保证无论有多少线程执行此getter,数组都只实例化一次
非ARC ONLY:保留是因为您希望数组在该方法执行之后继续存在(同样,仅当您不使用ARC时)
另外,如果您不希望在某处看到nil
值,因为这意味着存在一些逻辑错误:使用断言。以下是如何使用它们的示例:
assert(self.testerLog != nil);
NSArray *result = [NSArray arrayWithArray:self.testerLog];
是
self.testerLog
nil吗?你们初始化过它吗?@KurtRevis在主帖子中添加了初始化方法。错误还表示无法插入4830对象,因为它是nil。testerLog不应为零。这就是为什么在main post中对meAdded初始化方法如此奇怪的原因。也可以从多个线程调用[self.testerLog addObject:]。可能会导致错误吗?谢谢。关于断言的好建议。关于问题:您如何看待使用@synchronization关键字添加日志?类似于:@synchronized(self.testerLog){[self.testerLog addObject:logString];}我还认为问题不在于初始化测试程序日志数组。例外情况是“尝试从对象[4830]插入nil对象”,所以数组中的一个对象似乎是nil。变成零。这是怎么发生的?@Alexey-如果您在多个线程中向同一数组写入或从同一数组读取字符串,那么您应该确保每次向该数组写入或读取字符串时都是线程安全的。您确实可以尝试在此类代码周围添加@synchronized(self.testerLog){}
,以尝试此操作。