开发中遇到的奇葩问题
案例十八:
Flutter中,使用了一个第三方库存储App配置库(这个库为了能实现同步取值,要求进行初始化再使用,否则单例为null所有操作均失效),在一次修改中,需要通过配置确定代码执行逻辑。因而将配置读写移动到了配置库初始化之前,由于对该库使用逻辑不熟悉,导致忽略了初始化顺序。另一方面,这个配置是用作区分正式包和测试包的,一般测试都是使用的测试包,导致问题上线之后才被发现.
案例十七:
UIScrollView添加了UIButton,在UIButton上无法拖动 UIScrollView,需要在UIScrollView子类中实现下面这个方法
https://stackoverflow.com/questions/3512563/scrollview-not-scrolling-when-dragging-on-buttons/3550157#3550157
- (BOOL)touchesShouldCancelInContentView:(UIView *)view { if ([view isKindOfClass:[UIButton class]]) return YES; return [super touchesShouldCancelInContentView:view]; }
案例十六:
应用调试时出现以下弹窗:(以下为我遇到的一种情况,出现该弹窗的情形还很多)
Message from debugger: Terminated due to memory issue
检查控制台是否有很多类似以下的输出:
案例十五:
UIAlertController *alertVC = [UIAlertController alertControllerWithTitle:@"" message:@"选择连接设备" preferredStyle:UIAlertControllerStyleActionSheet]; UIAlertAction *cancel = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:^(UIAlertAction *action) { [alertVC dismissViewControllerAnimated:YES completion:^{ [self popUp]; }]; }]; for (BLEDevice *p in list) { UIAlertAction *item = [UIAlertAction actionWithTitle:p.peripheral.name?:p.peripheral.identifier.UUIDString style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) { [alertVC dismissViewControllerAnimated:YES completion:^{ [self willConnectToPeripheral:p]; }]; }]; [alertVC addAction:item]; } [alertVC addAction:cancel]; self.alertVC = alertVC; [self presentViewController:alertVC animated:YES completion:nil];
上面这段代码,在iOS12.4中出现,alertVC不执行执行dismiss的completion方法,在iOS13及后续版本中正常。当执行到handle的时候,actionsheet类型的alertVC已经dismiss完成了,所以在iOS12.4这条语句是无效的不会执行,iOS13应该是做了处理。另外在这里面使用了直接使用了self(无论是在completion函数中还是handle函数中),都会导致循环引用。
案例十四:
页面重后台唤起后出现无法点击、无法响应事件的问题,但是界面显示的倒计时,滚动等均正常,说明主线程无卡死,mainRunLoop运行正常,后面发现这些是在切换到后台时/后,触发了一些动画(自定义界面显示/隐藏,MMPopView的hide方法),使用了[UIView animation...complete:..]方法,而恢复现场(变为结束状态)限制为了finish为true才会执行,然而切换到后台,动画过程会被忽略,动画并非正常结束finish为false,导致界面不响应等Bug。解决方法是,针对finsh为false进行对应处理
案例十三:
在for循环中,如果循环是在try-catch中间,那么在限制值没有修改的情况下,还是出现了这个值发生了变化最终导致循环次数异常,去除try-catch后正常
案例十二:
在低版本(9.0)中,自动布局如果没有明确描述确定位置(如没有left只有top size 的描述,就可能会出现left值不稳定出现严重位移)
案例十一:
pod 导入第三方Framework,里面的头文件和SDK在根目录可能是快捷方式引用,这个时候如果说报错文件头文件找不到,这个问题原因可能并不是说头文件不在或者说快捷方式导致找不到,而是可以先把项目中标红的引用先去掉,比如libstdc++6.9.0之类的过期系统库,然后重新编译,错误可能也就没有了
案例十:
UITableView出现Cell向下偏移了35,解决方案是在设置代理之前设定一下tableViewHeadView和tableViewFootView,但是似乎不能通过[uiview new]设置,要显示设定高度
_tableView.tableHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, DWF(375), CGFLOAT_MIN)]; _tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, DWF(375), CGFLOAT_MIN)]; //这两个不设置的话,group风格的tableview可能出现下面增加空白<35的问题 _tableView.estimatedSectionFooterHeight = CGFLOAT_MIN; _tableView.estimatedSectionHeaderHeight = CGFLOAT_MIN;
https://www.jianshu.com/p/dea9c7792d4b
案例九:
正常请求接口,其它的都正常,有的接口一直会404,可能是参数不正确(字段,参数个数),服务器直接返回了404错误页面
案例八:
之前判断设备的网络状态,是通过状态栏的属性来的,这个方法并不是很好,而且在iPhoneX上因为设计上的不同,方法不可用,并且会导致奔溃。https://www.cnblogs.com/jukaiit/p/8145200.html http://blog.csdn.net/z040145/article/details/78871940
案例七:
在一个计时器中,计时器执行的方法有一个延迟执行的方法(延迟时间为0,背景线程执行),点击返回按钮销毁计时器时,屏幕会闪烁,并且无法正常退出,改为主线程并且不在使用prefre...函数调用后正常。
案例六:
在UICollectionView中,有一个cell计算高度的时候,由于没有内容,所以将高度设置为了CGFLOAT_MIN,结果导致下面的每个section的cell无辜消失了两个,并且不走新建的方法,因此如果一个cell存在,务必将它的高度设定为1.0及以上
案例五:
在iOS11中出现很多UITableView及UIScrollView的变化,很揪心的那种
具体讲UITableView
1.拉到底部,上拉刷新,刷新之后,显示位置总是上移(出现在内容超过一屏幕以上的情况),原因查出来是在reloadData的时候,contentSize发生了变化(变小了),具体的说就是,在计算contentSize的时候计算值偏小,而在iOS11中计算的依据,不再是通过你设定的高度来的,而是你设置的大概值是多少来计算的(这也就是所谓的在iOS11中更加顺畅的原因吧,我觉得比较坑开发),如果在代理里面加入下面几行代码就可以解决这个问题(为了保证流畅,固定行高是最佳选项!不停地变高就是变态--|||)
//([UIDevice currentDevice].systemVersion.floatValue >= 9.0f)在iOS9.0之前,像下面方法这样去实现会出现奔溃,原因应该是循环引用了可以在之前的版本返回44.0f毕竟在iOS11之前的版本不存在说上拉刷新位移的问题
1
- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath { return ([UIDevice currentDevice].systemVersion.floatValue >= 9.0f)?[self tableView:tableView heightForRowAtIndexPath:indexPath]:44.0f; }
8 //下面两个函数如果实现在iOS11之前必须返回大于等于1.0f的值(可以显示出来的值),否者设置头和尾的时候会报错,在iOS11没问题,可以不实现(不建议实现) 9 - (CGFloat)tableView:(UITableView *)tableView estimatedHeightForHeaderInSection:(NSInteger)section 10 11 { 12 13 return [self tableView:tableView heightForHeaderInSection:section]; 14 15 } 16 17 - (CGFloat)tableView:(UITableView *)tableView estimatedHeightForFooterInSection:(NSInteger)section 18 19 { 20 21 return [self tableView:tableView heightForFooterInSection:section]; 22 23 }
案例四:
关于在iOS11布局变化的其他设定:
在UITableView中设置
if ([UIDevice currentDevice].systemVersion.floatValue >= 11.0f)
{
[self setEstimatedSectionHeaderHeight:CGFLOAT_MIN];
[self setEstimatedSectionFooterHeight:CGFLOAT_MIN];
}
在AppDelegate中设置
if ([[UIDevice currentDevice].systemVersion floatValue] >= 11.0)
{
if (@available(ios 11.0,*))
{
UIScrollView.appearance.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
}
}
案例三:
for (LibraryPhotoObject * __block photoObject in functionObject.photoObjects) 像这种在for里面写上__block的用法,会导致其他引用了这个对象的数组无法正常释放导致程序carsh
案例二:
p2 在打包给测试app测试时,证书选择老是出错提示miss啥啥啥的(xcode9),无法完成打包,原因是不可以使用xcode管理的证书(也可能是9要求使用新版证书描述文件),只要在开发网站创建新profile后下载选择该文件后即可正常打包。(如果觉得不麻烦可以使用xcode打包,但是不推荐)
p1 在xcode中,打包上传都不会报错,上传成功后(loder上传进度完成),在构建中始终不能出现构建版本,邮件提示说版本不可用由于缺少配置字段Icon什么鬼,其实是因为这个版本的Icon配置不完整,将assets里面Icon的所有值配置完善,并且在info.plist新增字段
CFBundleIconName String Icon
即可正常上传成功
案例一:
1.UIScrollView的contentoffset不能达到设定的大小小数位精度,比如分页中:第二页的offset计算应该是120.000323但是实际上,实际的offset可能就是120.0,所以通过offset来判断的话就会出现不相等的而条件不成立的情况,所以最好是使用整数来作为控件的frame