开发中遇到的奇葩问题

案例十八:

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

检查控制台是否有很多类似以下的输出:

CGContextDrawImage: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable。
这个问题显然是绘制的时候没能取得上下文,这个时候可以在target中设置CG_CONTEXT_SHOW_BACKTRACE环境变量为YES,下次触发的时候就可以看到出问题的调用栈了。我这边是解决了这个执行错误警告⚠️之后,崩溃问题也就没有了。如果说视图Layer的contents的CGImage对象过大,也可能出现闪退(复用的重要性)。另外如果对视图进行非常频繁大量的层级/布局变化,也有可能会出现crash。在创建绘制图片上下时,务必保证传入的图片尺寸算出来后像素尺寸为整数

案例十五:

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

posted @ 2017-07-04 16:19  雨筱逸悠  阅读(487)  评论(0编辑  收藏  举报