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){}
,以尝试此操作。