从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,设置
opaque
为YES
,这样在绘制该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
手工导入,如果你的项目中已经集成了SDWebImage
,MJRefresh
,MBProgressHUD
, 那么删除EaseUI
中的三个第三方。
删除是要注意:
-
MBProgressHUD
,只要删除MBProgressHUD.h
, 和MBProgressHUD.m
两个文件;
2.MJRefresh
,删除整个文件夹; -
SDWebImage
在EaseUI
中叫做EMSDWebImage
,删除该文件夹。此时运行项目还会报错,这时需要在项目的PCH
文件中引入头文件:#import<HyphenateLite/HyphenateLite.h>
和import”EaseUI.h”
,再将EaseUI
中导入Hyphenate
的地方均改为HyphenateLite
(如果你导入的是Hyphenate
则不会有此报错),将和SDWebImage
相关的全面的EM
删掉, 例如UIImage+EMGIF
,删除EM
变为UIImage+GIF
;如果觉得不知道怎么找,那就command + B
进行编译,报错后点开查看是和SDWebImage
相关的吧前面的EM
都删掉
- APNs证书创建和上传到环信后台
- 头像昵称的简述和处理方案
- 音视频离线推送Demo实现
- 环信服务器聊天记录保存多久?
- 离线收不到好友请求
- IOS中环信聊天窗口如何实现文件发送和预览的功能
- ios集成常见问题
- 环信推送的一些常见问题
- 实现名片|红包|话题聊天室等自定义cell
五、即时通讯有哪些(那些第三方)
极光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)
网友评论