iOS开发

驳杂的知识点

2018-07-27  本文已影响0人  whoiamwhere

{

KVO原理

2个方法  addObsever

obsevervalueforkeypaths

kvo是用runtime写的

对一个属性进行监听,当这个属性的值修改时触发监听方法。

举例:你有个people类,people类里有个name的属性,

你对name 属性进行了监听,此时 系统会给people类生成一个派生类, 并重写name 的setter方法,当值发生改变时 会调用 willdidchage 方法,这时 setter 方法会记录 name 的是旧值,然后跟新值做对比 如果不同则调用 didchage 方法。

}

{

WEBP

http://www.cnblogs.com/lizheng114/p/6582352.html

Png >WebP>jpg(大小)

Png 无损压缩 webp分两种(有损,跟无损)jpeg 有损

如果用了webp那webview图片不显示

}

{

mvc mvvp

mvc 这个模式 没有人说他 不好 ,这绝对是个大神模式,被神化了的mvvm。

 先来看看mvc  的C    在传统中c 层的存在着你的强业务逻辑跟弱业务逻辑,这样子做你的C就显得特别臃肿,这时候大家又推除了 M 层,M 分两种 胖M 跟瘦M  瘦M 就不用说了 简单的OOP 带几个属性的 , 为了减轻C  把一部分若业务 又递交给了M  这时候你会发现  你的M 变成了 胖M 这时候

}

{

AOP 

网络请求分成好几个步骤

viewdidload  对这个拆分

OOP 

所有的设计模式的三大特征  封装  继承  多态

}

{

NSTimer 

在做界面滑动等操作时,计时器会不准

导致误差的原因是我在使用“scheduledTimerWithTimeInterval”方法时,NSTimer实例是被加到当前runloop中的,模式是NSDefaultRunLoopMode。而“当前runloop”就是应用程序的main runloop,此main runloop负责了所有的主线程事件,这其中包括了UI界面的各种事件。当主线程中进行复杂的运算,或者进行UI界面操作时,由于在main runloop中NSTimer是同步交付的被“阻塞”,而模式也有可能会改变。因此,就会导致NSTimer计时出现延误。

解决这种误差的方法,一种是在子线程中进行NSTimer的操作,再在主线程中修改UI界面显示操作结果;另一种是仍然在主线程中进行NSTimer操作,但是将NSTimer实例加到main runloop的特定mode(模式)中。避免被复杂运算操作或者UI界面刷新所干扰。这里我经常用的是他:

[[NSRunLoop currentRunLoop]addTimer:self.timer forMode:NSRunLoopCommonModes];

}

{

GCD之serial queue

之前说过GCD中的serial queue是FIFO的执行次序,也就是说你依次添加进queue的任务会按照先后顺序执行完毕.

最近在做一个关于iCloud的项目,在更新文件夹内容变化的时候用到了serial queue,处理逻辑如下:

}

{

http://www.cnblogs.com/scorpiozj/archive/2011/11/15/2250365.html

}

{

谈谈Mac?what?。。。

MVC  block了解多少需要注意啥

谈谈runloop

http://www.cnblogs.com/jiangzzz/p/5619512.html

Swift oc区别。

}

{

1、RT,一个面试官问的。我说,block是能够截获自动变量的匿名函数,他没有说什么。请问这个问题应该如何回答?

2、还有一个面试官曾经问我,生成一百个单例对象,如何作内存管理?我说我想到的就是显式增加@autoreleasepool来控制内存峰值。。。这个问题又应该如何回答?

}

{

链式编程思想特点:方法的返回值必须是方法的调用者

函数式编程思想:是将操作尽可能写在一起!嵌套的函数!!

本质:就是往方法里面传入Block,方法中嵌套Block调用.

}

{

“可以把信号想象成水龙头,只不过里面不是水,而是玻璃球(value),直径跟水管的内径一样,这样就能保证玻璃球是依次排列,不会出现并排的情况(数据都是线性处理的,不会出现并发情况)。水龙头的开关默认是关的,除非有了接收方(subscriber),才会打开。这样只要有新的玻璃球进来,就会自动传送给接收方。可以在水龙头上加一个过滤嘴(filter),不符合的不让通过,也可以加一个改动装置,把球改变成符合自己的需求(map)。也可以把多个水龙头合并成一个新的水龙头(combineLatest:reduce:),这样只要其中的一个水龙头有玻璃球出来,这个新合并的水龙头就会得到这个球。” —  来自博文http://blog.csdn.net/xdrt81y/article/details/30624469

}

{

iOS架构师

https://casatwy.com/iOS架构师

https://casatwy.com/

}

{

深拷贝浅拷贝

nsstring copy    浅    nsstring

nsstring mutableCopy  深    nsmutableString

nsmutableString copy  深    nsstring

nsmutableString mutableCopy深  nsmutableString

}

{

Rac.  冷信号,热信号

冷信号:每次去订阅这个信号,他的执行体,会重新执行一遍。ABC 都定义一遍,他就走3遍。(转播)(racsingnal)

热信号:只能收到订阅之后触发的信号。(直播)(commid)

https://tech.meituan.com/talk-about-reactivecocoas-cold-signal-and-hot-signal-part-1.html

}

{

For the most part,use UIKit classes only from your app’s main thread. This is particularly true for classes derived from UIResponder or that involve manipulating your app’s user interface in any way.

在大多数的时候 , 在你的 app 里使用 UIKit 的类只能在主线程. 尤其适用于类UIResponder源于或涉及操纵你的应用程序的用户界面。

苹果 Foundation 和 UIKit 大部分 API 不是线程安全的 因为程序涉及到多线程地方毕竟是少数应用场景 苹果给每个方法属性加这种线程锁 线程同步锁 自旋锁 什么的 太麻烦 和消耗性能 需要开发者在使用到地方时自己注意下线程安全,避免多个线程访问同一块资源,包括多个线程对同一个 UI 对象的操作  像 NSArray NSDictionary 不可变的都是线程安全的 而 NSMutableArray NSMutableDictionary 线程是不安全的.

}

{

opration与gcd的区别跟gcd死锁问题

Opration是基于oc对象封装的  gcd是基于C语言写的(处理速度gcd快)

Opration 可以设置优先级 可以使一个并行队列中的opration 先后执行  gcd可以设置队列的优先级。 

Opration 可以用kvo 监听 opration 是完成了 还是 取消了  正在执行的  不能取消  gcd不能被取消(好像也能,就是比较麻烦,暂时不知道)。

Opration 可以 继承 然后添加属性 方便复用  gcd不能继承。

Opration 可以相互依赖  在并行队列中 可以根据一个opration  执行完毕再执行 。

总结 

NSOpertation是更为高级的多线程抽象,其在做框架时应该被优先考虑,结构会更好。关于GCD的的执行效率方面,不会比NSOperation快太多,自己的话还是用GCD爽些。

Gcd死锁问题     

在主线程中 开辟同步线程 :主线程是一直都会执行任务的, 而开辟了 同步线程会抢用主线程资源 导致死循环

在串行队列中调用  开辟同步线程 里面在开辟 同步线程 

在串行队列中调用  开辟异步线程 里面在开辟 同步线程 

3中情况会发生线程死锁问题

}

{

iOS  里面拦截 所有网络请求 

NSURLProtocol

这个东西 可以拦截 所有网络请求  你可以根据域,来过滤。如果有webview 注意配置合作方的  网络域

}

{

https://www.jianshu.com/p/bc3f8424fad3

}

上一篇下一篇

猜你喜欢

热点阅读