You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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 属性访问不规范+内存管理错误

  1. 你在GetTimings方法中直接访问实例变量arrTimings赋值,没有走属性的setter方法,如果是MRC开发环境,会导致旧的arrTimings对象没有被释放造成内存泄漏,同时多线程环境下同时读写该实例变量会出现野指针崩溃。建议统一用self.arrTimings访问属性。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 23:54:03