Objective-C调用initWithArray初始化NSArray出现crash问题求助
问题排查&修复方案
1 最高频崩溃原因:数组越界
你在loadData方法中没有判断array的元素数量,就直接调用[array objectAtIndex:0]取值,如果array为空(比如服务端返回空、数据解析失败为空),会直接触发数组越界崩溃。
修复建议:取值前先判断array是否为空:
if (array.count > 0) { // 再执行objectAtIndex:0的取值逻辑 } else { // 处理空数据逻辑 return; }
2 方法参数命名错误
你定义的GetTimings方法中,DId和ZId两个参数的形参名都是strId,属于语法错误,会导致编译警告,运行时取到的参数值不符合预期,后续逻辑执行会出错。
修复建议:修改形参名避免重复:
-(NSMutableArray*)GetTimings:(NSString*)LocId date:(NSDate*)date DId:(NSString*)strDId OrderType:(NSString*)strType ZId:(NSString*)strZId TotalDistance:(NSString*)strTotalDistance
3 属性访问不规范+内存管理错误
- 你在
GetTimings方法中直接访问实例变量arrTimings赋值,没有走属性的setter方法,如果是MRC开发环境,会导致旧的arrTimings对象没有被释放造成内存泄漏,同时多线程环境下同时读写该实例变量会出现野指针崩溃。建议统一用self.arrTimings访问属性。 self.SelectedDayTimings是retain修饰的属性,你直接给它赋值alloc生成的对象,会导致引用计数多+1造成内存泄漏,MRC下需要加上autorelease处理。
修复后代码参考:
// .m文件 -(void)loadData{ if (array.count <= 0) { return; } NSDictionary *firstItem = [array objectAtIndex:0]; NSMutableArray *timings = [self GetTimings:@"Id" date:date DId:[firstItem objectForKey:@"Id"] OrderType:[firstItem objectForKey:@"Type"] ZId:[firstItem objectForKey:@"ZId"] TotalDistance:[firstItem objectForKey:@"TotalDistance"]]; self.SelectedDayTimings = [[[NSMutableArray alloc] initWithArray:timings copyItems:YES] autorelease]; } -(NSMutableArray*)GetTimings:(NSString*)LocId date:(NSDate*)date DId:(NSString*)strDId OrderType:(NSString*)strType ZId:(NSString*)strZId TotalDistance:(NSString*)strTotalDistance { NSMutableArray *array1 = [[NSMutableArray alloc] init]; // 从服务端获取数据添加到array1中 self.arrTimings = [[[NSMutableArray alloc] initWithArray:array1] autorelease]; [array1 release]; return self.arrTimings; }
内容的提问来源于stack exchange,提问作者Honey
相关产品推荐
相关产品推荐

