调用subdataWithRange后调用replaceBytesInRange致NSMutableData崩溃排查
问题分析与修复
核心崩溃原因
subdataWithRange:方法返回的是不可变的NSData实例,你强制将它转换为NSMutableData只是编译层面的类型欺骗,实际对象是_NSInlineData(NSData的私有子类),并不支持replaceBytesInRange:withBytes:这个NSMutableData独有的方法,这直接导致了"unrecognized selector"崩溃。
次要语法错误
代码中NSMakeRange(1, sizeof(uint8_t)缺少闭合的右括号,正确写法应为NSMakeRange(1, sizeof(uint8_t)),这个语法问题会导致编译失败或额外运行时异常。
修复方案
若要对截取的数据做修改,需把subdataWithRange:返回的NSData包装为新的NSMutableData实例,修正后的代码如下:
NSMutableData *data = [[NSMutableData alloc] initWithLength:1000]; // 将截取的不可变NSData转为可变数据 NSData *tempData = [data subdataWithRange:NSMakeRange(sizeof(uint8_t), 10)]; NSMutableData *d1 = [NSMutableData dataWithData:tempData]; uint8_t i = 10; // 补全右括号,修正语法错误 [d1 replaceBytesInRange:NSMakeRange(1, sizeof(uint8_t)) withBytes:&i];
内容的提问来源于stack exchange,提问作者user2515165
相关产品推荐
相关产品推荐

