针对微脉iOS版,在bugly上的崩溃反馈日志处理

1:发现数组越界崩溃, 原因很多都是在声明属性的时候,NSArray用的是strong,而不是copy,这是有潜在问题的,

​ 当NSString,NSDictionary,NSArray 这些不可变对象时,要用copy修饰; NSMutableArray这些可变对象时,用strong。

 用 @property 声明 NSString、NSArray、NSDictionary 经常使用 copy 关键字,是因为他们有对应的可变类型:NSMutableString、NSMutableArray、NSMutableDictionary,他们之间可能进行赋值操作(就是把可变的赋值给不可变的),为确保对象中的字符串值不会无意间变动,应该在设置新属性值时拷贝一份。

1. 因为父类指针可以指向子类对象,使用 copy 的目的是为了让本对象的属性不受外界影响,使用 copy 无论给我传入是一个可变对象还是不可对象,我本身持有的就是一个不可变的副本。
2. 如果我们使用是 strong ,那么这个属性就有可能指向一个可变对象,如果这个可变对象在外部被修改了,那么会影响该属性。
   //总结:使用copy的目的是,防止把可变类型的对象赋值给不可变类型的对象时,可变类型对象的值发送变化会无意间篡改不可变类型对象原来的值。

复制代码

2: 发现有偶然性崩溃, 定位后找到原因是 和h5交互 或是后台获取数据时, 约定好的 字符串类型,结果返回的是int,这就导致后续操作crash。

​ 理论说和其他端约定好的类型 不应该变化的,但总会出现个别情况 会有变化,只要一变化 就导致了crash,所以也不能说全是他们问题,咱们这边也应该做一些健壮性的处理,预防偶发性的crash。

针对这种问题,我在strOrEmpty做了处理,代码如下:

inline NSString * strOrEmpty(id str){

    if (![str isKindOfClass:[NSString class]]) {

        str = [NSString stringWithFormat:@"%@",str];

    }

    BOOL hasTest = ((str==nil) || (str==NULL) || [str isEqualToString:@"(null)"] || [str isKindOfClass:[NSNull class]]);

    NSLog(@"last:%@",(hasTest==YES?@"":str));

    return (hasTest==YES?@"":str);

}

复制代码

​ 后面在接收字符串的时候 用strOrEmpty过渡一下,既可以判断为空的处理,又可以处理其他类型问题。

3:发现有插入nil崩溃,进行网络请求传入dic时,有直接给dic赋值的情况,这种情况下 当传入的value为空时,就会抛出异常。

​ 解决这种问题的方法,最好是用我之前写的ApiParam,这里面对value进行了处理,统一起来 网络请求传字典时 都用这种格式,能提高代码稳定健壮性,也能有个代码规范。

ApiParam *param = [ApiParam new];
   [param setValue:[WMCache getMemoryLoginModel].LIUSHUIHAO forName:@"kehubh"];
   [param setValue:_locationLongitude  forName:@"jingdugps"];
   [param setValue:_locationLatitude   forName:@"weidugps"];
   
   WMHomeRefreshAPIManager *refreshAPI = [[WMHomeRefreshAPIManager alloc] init];
   [refreshAPI loadDataWithParams:[param dictionary] withSuccess:^(NSURLSessionDataTask *task, id responseObject) {
复制代码

4:发现tableView里的----数组越界----问题

​ a.判断数组为空时候的越界问题当首次数据没有请求完毕的时候[tableVIew reloadData],就会导致crash。这个时候需要做一次判断:if(self.dataArray.count > 0){}

​ b. 有时候会出现上拉加载更多后点击下拉出现crash,这个时候提示数组越界但是并不是真的越界

因为这个时候的indexpath.row > 数组的元素个数的。 所以需要以下处理:if(indexpath.row < self.dataArray.count){}。 而在didSelect方法里,只是判断dataArray.count>0,是不能杜绝这种问题的.

  所以总结下来,为了让数组不越界,在cellforRow 和 didSelect 里都要使用if(indexpath.row < self.dataArray.count){} !! 
  			collection同理
复制代码

待续。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值