这几天公司不是很忙,整理了一些琐碎的知识点。

一、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比较好.

  1. 首先,得到视频的URL
  2. 根据URL创建AVPlayerItem
  3. 把AVPlayerItem 提供给 AVPlayer
  4. AVPlayerLayer 显示视频。
  5. AVPlayer 控制视频, 播放, 暂停, 跳转 等等。
  6. 播放过程中获取缓冲进度,获取播放进度。
  7. 视频播放完成后做些什么,是暂停还是循环播放
    使用 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中,跟前三种保存方式相比,相对比较复杂一些。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容

  • 1、为什么说Objective-C是一门动态的语言? 静态、动态是相对的,这里动态语言指的是不需要在编译时确定所有...
    River_YYH阅读 1,938评论 0 14
  • 1. clipsToBounds:是指视图上的子视图,如果超出父视图的部分就截取掉,masksToBounds:是...
    Alfred的记录本阅读 394评论 0 0
  • 1、ios内存管理机制 iOS内存管理机制的原理是引用计数,当这块内存被创建后,它的引用计数0->1,表示有一个对...
    Daniel_you阅读 477评论 0 6
  • OC的理解与特性OC作为一门面向对象的语言,自然具有面向对象的语言特性:封装、继承、多态。它既具有静态语言的特性(...
    LIANMING_LI阅读 478评论 0 0
  • 一、基础知识点 设计模式是什么? 你知道哪些设计模式,并简要叙述? 设计模式是一种编码经验,就是用比较成熟的逻辑去...
    软件iOS开发阅读 1,234评论 0 26