这几天公司不是很忙,整理了一些琐碎的知识点。
一、SDWebImage的原理,实现机制。
:先从内存图片缓存查找是否有图片,如果内存中已经有图片缓存,SDImageCacheDelegate 回调 imageCache:didFindImage:forKey:userInfo: 到 SDWebImageManager。
2:如果内存缓存中没有,生成 NSInvocationOperation 添加到队列开始从硬盘查找图片是否已经缓存。
3:SDWebImageManagerDelegate 回调 webImageManager:didFinishWithImage: 到 UIImageView+WebCache 等前端展示图片。
4:如果从硬盘缓存目录读取不到图片,说明所有缓存都不存在该图片,需要下载图片,回调 imageCache:didNotFindImageForKey:userInfo:。
5:图片下载由 NSURLConnection 来做,实现相关 delegate 来判断图片下载中、下载完成和下载失败
6:connectionDidFinishLoading: 数据下载完成后交给 SDWebImageDecoder 做图片解码处理
7:SDWI 也提供了 UIButton+WebCache 和 MKAnnotationView+WebCache,方便使用
8:SDWebImagePrefetcher 可以预先下载图片,方便后续使用
二、如何解决TableView卡的问题。
tableView 滑动卡的问题主要是因为从缓存中或者是从本地读取图片给UIImage的时候耗费的时间。如果是动态行高,计算出高度之后在缓存。
把这两句话放到子线程:
NSData *imgData = [NSData dataWithContentsOfURL:[NSURL URLWithString:app.icon]]; //得到图像数据
UIImage *image = [UIImage imageWithData:imgData];
三、block和代理的,通知的区别。block的用法需要注意些什么。
1:代理: 代理就是来解决类耦合性和封装变化点的,多人开发中,防止一个类改变导致别的地方也被动改变,代理通俗的说其实就是set赋值,用对象地址调用对象的方法,给对象赋值。代理是委托方声明方法,并调用,代理方实现。
2:block:目的就是能够直接存储一个代码块的实现部分,而不需要再去定义一个函数,block就是去相当于实现代理,block是委托方声明block方法,并调用,在代理方里面用委托方调用那个block方法,并且实现。block效率更高。block防止内存泄漏,解决循环引用的问题。
3:通知:首先通知可以群发,而代理和block只能单发,通知就是一方传值,一方接收值,把所有的东西传到一个集合里,可以控制发送给全部还是自己,接收也同样可以控制。通知传值在远距离传值时有优势。例子:第一页推出第二页,第二页推出第三页,要想把第三页的值传给第一页,用通知传。
如果用block,block的实体在第一页,指针在第三页,无法结合,因为第三页是第二页推出来的,需要和第二页先进行交互,代理道理和block差不多。
四、strong,weak,retain,assign,copy, nomatic 等的区别。
1、assign: 简单赋值,不更改索引计数,防止循环引用。
2、strong:一般来说,类“内部”的属性设置为strong,类“外部”的属性设置为weak。说到底就是一个归属权的问题。小心出现循环引用导致内存无法释
3: retain:保留计数,获得对象的所有权。不用自动管理内存(ARC)用retain很多;retain拷贝指针。
4:copy: 建立一个索引计数为1的对象,然后释放旧对象 用来复制对象。
5:nomatic:对属性赋值的时候不加锁,多线程并发访问会提高性能。
五、NSString 的时候用copy和strong的区别。
首先要用copy因为copy修饰的NSString,在初始化时,如果来源是NSMutableString的话,会对来源进行一次深拷贝,将来源的内存地址复制一份,这样,两个对象就一点关系就没有了,无论你怎么操作来源,都不会对自己的NSString有任何影响。
比如你有一个:
@property(nonatomic,copy) NSString *str;
然后有一个:
NSMutableString *sourceStr;
当你进行str = sourceStr操作之后,紧接着你又改变了sourceStr的内容sourceStr = @"change";那么str的内容并不会改变. 如果你的str不是copy修饰的,而是strong修饰的,那么str的值也会变成@"change";因为strong是浅拷贝的,并不会对来源的内存地址进行拷贝,你只需要记住一点,当你给你的的NSString对象赋值时,如果来源是NSMutableString,那么这种情况就必须要用copy;如果你确定来源是不可变类型的,比如@"http://www.baidu.com”这种固定的字符串,那么用strong比较好.
- 首先,得到视频的URL
- 根据URL创建AVPlayerItem
- 把AVPlayerItem 提供给 AVPlayer
- AVPlayerLayer 显示视频。
- AVPlayer 控制视频, 播放, 暂停, 跳转 等等。
- 播放过程中获取缓冲进度,获取播放进度。
- 视频播放完成后做些什么,是暂停还是循环播放
使用 AVPlayer 的时候,一定要注意 AVPlayer 、 AVPlayerLayer 和 AVPlayerItem 三者之间的关系。 AVPlayer 负责控制播放, layer 显示播放, item 提供数据,当前播放时间, 已加载情况。 Item 中一些基本的属性, status, duration, loadedTimeRanges, currentTime(当前播放时间)。
介绍项目:
在介绍项目的时候,可以从项目整体到模块,模块从左到右,界面从上到下的顺序一一介绍。或者从项目整体到模块,在介绍模块时,从重要、核心模块开始。在介绍项目时,要将项目整体定位、功能模块、主要技术都要介绍清楚,有一定的层次性
2、MVC设计模式是什么? 你还熟悉什么设计模式
设计模式:并不是一种新技术,而是一种编码经验,使用比如java中的接口,iphone中的协议,继承关系等基本手段,用比较成熟的逻辑去处理某一种类型的事情,总结为所谓设计模式。
mvc设计模式 :模型,视图,控制器,可以将整个应用程序在思想上分成三大块,对应是的数据的存储或处理,前台的显示,业务逻辑的控制。 Iphone本身的设计思想就是遵循mvc设计模式
代理模式:代理模式给某一个对象提供一个代理对象,并由代理对象控制对源对象的引用.
单例模式:单例模式创建以后,全局使用。说白了就是一个类不通过alloc方式创建对象,而是用一个静态方法返回这个类的对象。
3:开发者证书
证书分两种:开发者证书、发布者证书。前者开发时使用,后者发布使用
(1) 模拟器调试无需代码签名;真机调试需开发者证书代码签名;发布时需发布证书签名
(2) 代码签名需要:证书+私钥,
(3) 真机调试时要求在设备上安装描述文件(provision profile),该文件包含信息:调试者证书,
授权调试设备清单,应用ID。一个应用对应一个描述文件
4:如何追踪app崩溃率,如何解决线上闪退
当App闪退时,操作系统会生成一个crash日志,保存在设备上。crash日志上有很多有用的信息,比如每个正在执行线程的完整堆栈跟踪信息和内存映像,这样就能够通过解析这些信息进而定位crash发生时的代码逻辑,从而找到App闪退的原因
违反iOS系统规则产生crash的三种类型:
(1)内存报警闪退
内存过低时,系统会发出内存过低警告。尝试收回一些内存,如果没有改善,将会终止当前的运行程序。
(2) 响应超时
当应用程序对一些特定的事件(比如启动、挂起、恢复、结束)响应不及时苹果的Watchdog机制会把应用程序干掉。
(3) 用户强制退出
总结闪退原因:常见的崩溃原因基本都是代码逻辑问题或资源问题,比如数组越界,访问野指针或者资源不存在,或资源大小写错误等。
5:APP发布的上架流程
1.登录应用发布网站添加应用信息;
2.下载安装发布证书;
3.选择发布证书,使用Archive编译发布包,用Xcode将代码(发布包)上传到服务器;
4.等待审核通过;
5.生成IPA:菜单栏->Product->Archive.
6:对沙盒的理解
1.应用程序在自己的沙盒中运作,但是不能访问任何其他应用程序的沙盒;
2.应用之间不能共享数据,沙盒里的文件不能被复制到其他应用程序的文件夹中,也不能把其他应用文件夹复制到沙盒中;
3.苹果禁止任何读写沙盒以外的文件,禁止应用程序将内容写到沙盒以外的文件夹中;
4.沙盒目录里有三个文件夹:Documents——存储;应用程序的数据文件,存储用户数据或其他定期备份的信息;Library下有两个文件夹,Caches存储应用程序再次启动所需的信息,Preferences包含应用程序的偏好设置文件,不可在这更改偏好设置;temp存放临时文件即应用程序再次启动不需要的文件
7、内存的使用和优化的注意事项
1:重用问题:如UITableViewCells、UICollectionViewCells、UITableViewHeaderFooterViews设置正确的reuseIdentifier,充分重用
2)尽量把views设置为不透明:当opque为NO的时候,图层的半透明取决于图片和其本身合成的图层为结果,可提高性能;
3)不要使用太复杂的XIB/Storyboard:载入时就会将XIB/storyboard需要的所有资源,包括图片全部载入内存,即使未来很久才会使用。那些相比纯代码写的延迟加载,性能及内存就差了很多;
4)正确选择图片加载方式:
8:plist文件是用来做什么的。一般用它来处理一些什么方面的问题
我们常用的NSUserDefaults偏好设置实质上就是plist文件操作。plist文件是用来持久化存储数据的;我们要存储全国城市名称和id,那么我们要优先选择plist直接持久化存储,因为更简。
9、在提交苹果审核时,遇到哪些问题被拒绝
1)最常见到的就是app中有虚拟物品交易,但是不是走内购导致被拒。
2)音频类App或者使用到音频相关的app,因为版权问题而被拒
10、熟悉CocoaPods么?能大概讲一下工作原理么
它会为我们创建一个工作区间,然后将所有在cocoapods中的引入的第三方库以libPods.a这样的方式引入到我们的工程中,这样就可以直接访问第三方库了
11、你一般是如何调试Bug的?
线上Bug:项目使用了友盟统计,因此会有崩溃日志,通过解析dYSM可以直接定位到大部分bug崩溃之处
测试Bug:根据测试所反馈的bug描述,若语义不清晰,则直接找到提bug人,操作给开发人员看,最好是可以bug复现。解决bug时,若能根据描述直接定位bug出错之处,则好处理;若无法直观定位
12、简单描述一下XIB与Storyboards,说一下他们的优缺点
优点:
• XIB:在编译前就提供了可视化界面,可以直接拖控件,也可以直接给控件添加约束,更直观一些,而且类文件中就少了创建控件的代码,确实简化不少,通常每个XIB对应一个类。
• Storyboard:在编译前提供了可视化界面,可拖控件,可加约束,在开发时比较直观,而且一个storyboard可以有很多的界面,每个界面对应一个类文件,通过storybard,可以直观地看出整个App的结构。
• 缺点:
• XIB:需求变动时,需要修改XIB很大,有时候甚至需要重新添加约束,导致开发周期变长。XIB载入相比纯代码自然要慢一些。对于比较复杂逻辑控制不同状态下显示不同内容时,使用XIB是比较困难的。当多人团队或者多团队开发时,如果XIB文件被发动,极易导致冲突,而且解决冲突相对要困难很多。
• Storyboard:需求变动时,需要修改storyboard上对应的界面的约束,与XIB一样可能要重新添加约束,或者添加约束会造成大量的冲突,尤其是多团队开发。对于复杂逻辑控制不同显示内容时,比较困难。当多人团队或者多团队开发时,大家会同时修改一个storyboard,导致大量冲突,解决起来相当困难。
13、在App中混合HTML5开发App如何实现的。在App中使用HTML5的优缺点是什么?
常是通常UIWebView来实现,用代理方法去拦截。
优缺点:
• iOS加入H5响应比原生要慢很多,体验不太好,这是缺点。
• iOS加入H5可以实现嵌入别的功能入口,可随时更改,不用更新版本就可以上线,这是最大的优点
14、请描述一下同步和异步,说说它们之间的区别。
区别:
• 线程同步:是多个线程访问同一资源时,只有当前正在访问的线程访问结束之后,其他线程才能开始访问(被阻塞)。
• 线程异步:是多个线程在访问竞争资源时,可以在空闲等待时去访问其它资源(不被阻塞)。
15、线程是什么?进程是什么?二者有什么区别和联系?
一个程序至少有一个进程,一个进程至少有一个线程:
进程:一个程序的一次运行,在执行过程中拥有独立的内存单元,而多个线程共享一块内存
线程:线程是指进程内的一个执行单元。
联系:线程是进程的基本组成单位
15、iOS本地数据存储都有哪几种方式?
NSUserDefaults:用来保存应用程序设置和属性、用户保存的数据。用户再次打开程序或开机后这些数据仍然存在。NSUserDefaults可以存储的数据类型包括:NSData、NSString、NSNumber、NSDate、NSArray、NSDictionary。缺点:如果要存储其他类型,需要转换为前面的类型,才能用NSUserDefaults存储。
Write写入方式永久保存在磁盘中。第一步:获得文件即将保存的路径:第二步:生成在该路径下的文件:第三步:往文件中写入数据:最后:从文件中读出数据:
SQLite3:采用SQLite数据库来存储数据。SQLite作为一中小型数据库,应用ios中,跟前三种保存方式相比,相对比较复杂一些。