• 开发中遇到的奇葩问题


    案例十六:

    应用调试时出现以下弹窗:(以下为我遇到的一种情况,出现该弹窗的情形还很多)

    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

  • 相关阅读:
    Servlet & JSP
    Servlet & JSP
    Servlet & JSP
    Servlet & JSP
    Servlet & JSP
    Servlet & JSP
    Table of Contents
    Commons Codec
    14.Longest Common Prefix
    628.Maximum Product of Three Numbers
  • 原文地址:https://www.cnblogs.com/yuxiaoyiyou/p/7117169.html
Copyright © 2020-2023  润新知