美文网首页
iOS 面试题之项目中遇到的问题(一)

iOS 面试题之项目中遇到的问题(一)

作者: NingSpeals | 来源:发表于2021-03-23 16:29 被阅读0次

    从2.26开始面试,电话,视频,去公司面试,差不多十家多了,陆陆续续的有快一个月了,一个offer都没接到,有时候很打击,有时候感觉还好,总的来说好失败啊,少壮不努力,老大徒伤悲,现在就这种感觉,人丑就该多读书,沉淀自己吧😂😂😂

    还是总结一下遇到的面试问题吧

    一、说说你对tableview的优化
    • 1.提前计算并缓存好高度,因为heightForRow最频繁的调用。
    - (UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath;
    
    • 2.异步绘制,遇到复杂界面,性能瓶颈时,可能是突破口。
    • 3.滑动时按需加载,这个在大量图片展示,网络加载时,很管用(SDWebImage已经实现异步加载)。
    • 4.重用cells
    • 5.如果cell内显示得内容来自web,使用异步加载,缓存结果请求。当cell中的部分View是非常独立的,并且不便于重用的,而且“体积”非常小,在内存可控的前提下,我们完全可以将这些view缓存起来。当然也是缓存在模型中。
    • 6.少用或不用透明图层,使用不透明视图。对于不透明的View,设置opaqueYES,这样在绘制该View时,就不需要考虑被View覆盖的其他内容(尽量设置Cell的view为opaque,避免GPU对Cell下面的内容也进行绘制)
    • 7.减少subViews。分析Cell结构,尽可能的将相同内容的抽取到一种样式Cell中,前面已经提到了Cell的重用机制,这样就能保证UITbaleView要显示多少内容,真正创建出的Cell可能只比屏幕显示的Cell多一点。虽然Cell的’体积’可能会大点,但是因为Cell的数量不会很多,完全可以接受的
    • 8.少用addView给cell动态添加view,可以初始化的时候就添加,然后通过hide控制是否显示。只定义一种Cell,那该如何显示不同类型的内容呢?答案就是,把所有不同类型的view都定义好,放在cell里面,通过hidden显示、隐藏,来显示不同类型的内容。毕竟,在用户快速滑动中,只是单纯的显示、隐藏subview比实时创建要快得多。
    二、谈谈你是如何使用友盟埋点的

    没用过这个技术,不知道该怎么回答,网上百度了一下,也是各种各样,总结了几点,不知道对不对,还是缺乏实践吧。

    • 1、首先集成友盟SDK
    • 2、按照制定的统计协议(自定义事件,设定事件ID,设置事件属性)制定相关接口(计数事件:统计事件发生的次数,统计事件发生的属性的次数;计算事件:统计计算事件发生的属性的次数;自定义事件)设计调用接口
    • 3、打开友盟->功能使用->自定义事件
    • 4、点开设置->添加事件->手工添加
    • 5、在需要埋点的地方调用接口
    • 6、点击基础面板->功能使用->自定义事件,查看显示结果
    三、定位的偏移量怎么处理

    这个问题也没有遇到过,具体的也不知道怎么处理,百度查找一番,大概就是这个原因吧,也不知道对不对,有知道的欢迎指点一二,谢谢啦🙏🙏🙏

    在国内使用LocationManager定位所获得经纬度,是有一段较大距离的偏移的。原因是因为wifi 热点 、基站、 gps、等等所导致的都有,最后查找还是找到了问题所在,原来国内地图使用的坐标系统是GCJ-02而ios sdk中所用到的是国际标准的坐标系统WGS-84。因为国内使用的是加密后的坐标系GCJ-02就是网络上叫的火星坐标。locationManager就是因为得到的是火星坐标偏移后的经纬度,所以导致在MapView上有很大的偏差,而在MKMapView上通过定位自己位置所获得的经纬度有是准确,因为apple已经对国内地图做了偏移优化。MKMapView里的方法虽然简单,也可以实时的获取自己的位置而且基本上都是准确的位置,但是也就无法使用locationManager中的一些功能了,其实最有效的方法就是写一个关于OC火星坐标转换的算法,将WGS-84坐标系统转为GCJ-02的Objective-C代码,这样就能方便的使用CLLocationManager这个类了。

    四、环信导包,包丢失问题的处理

    这个问题也没有遇到过,具体的也不知道怎么处理,百度查找一番,把所有大家出现的问题都总结了一番,也不知道对不对,有知道的欢迎指点一二,谢谢啦🙏🙏🙏

    手动导入出现的问题:

    第一步: 创建工程并去环信官网下载下载环信 SDK
    第二步:把下载好的文件里的HyphenateSDK文件与EaseUI文件手动导入到你所创建的工程内
    第三步:在TARGETS---General---Embedded Binaries里添加HyphenateLite.framework并运行项目
    第四步:运行项目后会报错:'Hyphenate/Hyphenate.h' file not found

    解决办法: 复制#if ENABLE_LITE ==1到搜索栏搜索出所有包含的类,因为这些类都会陆续报这种类似的错,一次性解决问题,下图是搜索结果.点开所有类删除除了#import <HyphenateLite/HyphenateLite.h>这个以外的所有if内的内容. (每个类剩余的不一样,分别为HyphenateLite/HyphenateLite.h,HyphenateLite/EMConversation.h,HyphenateLite/EMMessage.h,HyphenateLite/HyphenateLite.h,HyphenateLite/HyphenateLite.h,HyphenateLite/EMConversation.h)之后运行,这个错误解决
    第五步:上述运行后会出现新的错误如(Cannot find interface declaration for xxx)
    解决办法:在PrefixHeader.pch中导入#import<UIKit/UIKit.h>即可解决,解决后再次运行项目
    第六步:上述运行后出现新的错误如下图(Unknown type name "NSString")
    解决方法:在左下角搜索类的方法里输入.c,搜索出所有是.c的类如(只搜索出一个),点开这个类,将属性的 identity and type改为Objective-C Source运行项目
    第七步:上述运行后有时会出现"_SDScaledImageForKey", referenced from:这个问题,但有时不会出现(不会出现的情况下运行项目不会再继续报错)
    出现这个问题解决办法:在左上角的搜索里输入inline进行搜索,点开这个类删除方法前缀“inline”即可解决。到此所有前期集成问题已全部解决.

    使用cocoapods导入出现的问题

    因为我的工程中有手动导入的重新封装过得MBProgressHUD,所以easeUI无法使用pods导入,故easeUI手工导入,如果你的项目中已经集成了SDWebImageMJRefreshMBProgressHUD, 那么删除EaseUI中的三个第三方。
    删除是要注意:

    1. MBProgressHUD,只要删除MBProgressHUD.h, 和MBProgressHUD.m两个文件;
      2.MJRefresh,删除整个文件夹;
    2. SDWebImageEaseUI中叫做EMSDWebImage,删除该文件夹。此时运行项目还会报错,这时需要在项目的PCH文件中引入头文件:#import<HyphenateLite/HyphenateLite.h>import”EaseUI.h”,再将EaseUI中导入Hyphenate的地方均改为HyphenateLite(如果你导入的是Hyphenate则不会有此报错),将和SDWebImage相关的全面的EM删掉, 例如UIImage+EMGIF,删除EM变为UIImage+GIF;如果觉得不知道怎么找,那就command + B进行编译,报错后点开查看是和SDWebImage相关的吧前面的EM都删掉
    五、即时通讯有哪些(那些第三方)

    极光IM、环信、融云、网易云信、leanCloud、阿里百川-云旺、ArrowIM 云丛网络、理约云

    六、如何获取app的崩溃信息(那些第三方)

    获取崩溃日志的几种方法:

    • 1、当用户抱怨闪退时,你可以要求他让设备与iTunes同步,设备与电脑上的iTunes Store同步后,会将崩溃日志保存在电脑上(路径:Mac OS X:~/Library/Logs/CrashReporter/MobileDevice/)到上述位置把崩溃日志下载下来,然后通过电子邮件发送给你;用这个方法获取崩溃日志时,你必需尽量获取用户设备生成的所有崩溃日志。因为崩溃日志越多,就越容易诊断问题所在。
    • 2、如果你装了Xcode,也能很容易通过Xcode从你的设备上获得崩溃日志;将iOS设备连接到电脑上,然后打开Xcode;从菜单栏上选择 Window菜单, 然后选择 Organizer (快捷方式是 Shift-CMD-2)在Organizer 窗口上, 选中 Devices 标签栏,在左侧的导航面板上,选中Device Logs;LIBRARY下面的Device Logs是你所有设备(曾经连接到Xcode的)的日志;每个设备下面的Device Logs是对应设备的日志。
    • 3、应用提交到App Store后,你也能从 iTunes Connect 获取到用户的崩溃日志,登录到 iTunes Connect 上,选择 Manage Your Applications, 点击相应的应用,点击应用图标下面的View Details按钮, 然后点击右栏Links部分的 Crash Reports;如果没有崩溃日志,试试点击“refresh”按钮刷新一下。如果你的应用用户量还不多,或者刚上架不久,iTunes Connect账号上也可能还没有任何崩溃日志;如果有的话你就会看到不同iOS版本用户下的崩溃信息。
    • 4、使用工具来获取应用程序崩溃日志,工具(名称:Bugly,网址:http://bugly.qq.com/)官网上由详细的讲解,还附有Demo (友盟) (bugtags 网址:https://www.bugtags.com)等等;
    • 5、iphone崩溃日志分析工具symbolicatecrash;Symbolicatecrash是Xcode自带的一个分析工具,可以通过机器上的崩溃日志和应用的.dSYM文件定位发生崩溃的位置,把crash日志中的地址替换成代码相应位置。
    七、tableView左右联动定位到某一行

    实现 tableView联动 主要分两种状况
    (1)点击左侧 cell 让右侧 tableView 滚到对应位置
    (2)滑动右侧 tableView 让左侧 tableView 滚到对应位置
    先实现简单的:点击左侧 cell 让右侧 tableView 滚到对应位置

    //MARK: - 点击 cell 的代理方法
    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
        // 判断是否为 左侧 的 tableView
        if (tableView == self.leftTableView) {
            // 计算出 右侧 tableView 将要 滚动的 位置
            NSIndexPath *moveToIndexPath = [NSIndexPath indexPathForRow:0 inSection:indexPath.row];
            // 将 rightTableView 移动到对应的 位置
            [self.rightTableView scrollToRowAtIndexPath:moveToIndexPath atScrollPosition:UITableViewScrollPositionTop animated:YES];
        }
    }
    

    滑动右侧 tableView 让左侧 tableView 滚到对应位置

    [self.rightTableView indexPathsForVisibleRows] 返回 所有显示在界面的 cell 的 indexPath

    //MARK: - 一个方法就能搞定 右边滑动时跟左边的联动
    - (void)scrollViewDidScroll:(UIScrollView *)scrollView {
        
        // 如果是 左侧的 tableView 直接return
        if (scrollView == self.leftTableView) return;
        
        // 取出显示在 视图 且最靠上 的 cell 的 indexPath
        NSIndexPath *topHeaderViewIndexpath = [[self.rightTableView indexPathsForVisibleRows] firstObject];
        
        // 左侧 talbelView 移动到的位置 indexPath
        NSIndexPath *moveToIndexpath = [NSIndexPath indexPathForRow:topHeaderViewIndexpath.section inSection:0];
        
        // 移动 左侧 tableView 到 指定 indexPath 居中显示
        [self.leftTableView selectRowAtIndexPath:moveToIndexpath animated:YES scrollPosition:UITableViewScrollPositionMiddle];
    }
    
    八、购物车抛物线如何形成的

    抛物线动画、阻尼动画、贝塞尔曲线,还有一些iOS相关的的·动画都要了解
    [文章一](https://www.jianshu.com/p/4b484f253a28?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation
    [文章二(https://blog.yayuanzi.com/15420.html
    [文章三](https://blog.csdn.net/anticipate91/article/details/52460985

    相关文章

      网友评论

          本文标题:iOS 面试题之项目中遇到的问题(一)

          本文链接:https://www.haomeiwen.com/subject/tzxfhltx.html