C语言iOS 知识点小结1

因白天都起作业,所以一般只有晚上会面总结一下,里面来诸多未客观的地方,欢迎提出。因为水平有限,好些都是圈之别人写的可比好之稿子,里面要用他人文章的地方下面还勾起参考。如果产生觉到丁侵蚀的作者,可以跟自我联络,我顿时删除。谢谢

目录:

1、KVO
2、KVC
3、 NotificationCenter KVO Delegate
之间的区别
3.1、通知的贯彻
3.2、代理的落实
4、类别和扩张的别
4.1、深入明Category的贯彻
5、多态
6、单例模式了解与以
7、沙盒的接头
8、Runloop
9、深浅拷贝
10、向一个空对象发送事件
11、MVC&MVVM
12、UIWebView和JS交互&WKWebVieW和JS交互
13、POST&Get 请求
14、栈&堆
15、property属性的修饰符的来意
15.1、iOS
属性中strong,weak,assign,retain,copy等特性
16、多线程
16.1、GCD的底实现
17、线程安全
17.1、线程死锁问题
18、本地数据存储
19、数据库的迁
20、TCP&UDP
21、Socket
22、HTTP & HTTPS
23、网络七叠协商
24、Bolck以及底层原理
25、常见的产出循环引用的气象
26、objc_msgSend的作用
27、消息发送机制
28、Runtime
28.1、isa指针
29、UITableView 的有关优化
30、drawRect内存优化
31、项目优化怎么开优化
32、优化种之家伙
33、autolayout的实现原理
34、事件之传递及响应机制
35、函数式编程的落实 &&
响应式编程概念
36、应用启动流程
37、UIViewController的完整生命周期
38、响应者链条
38.1、事件传递机制
39、不同APP之前是怎么相互传值的
40、什么是SEL&通过哪些措施可调用
41、SDWebImage解析
42、AFNetWorking简单分析
43、MJRefresh的基本原理
44、设计模式
45、安全体制
46、多媒体
47、编译过程做了什么样事情
48、字典大致实现的原理
49、数组的兑现原理
50、block和函数指针的知情
51、一般始于做一个档次,你的架构是安考虑的
52、你了解UIKit的布局也
53、OC的反光机制
54、反射机制
55、加解密
56、链式编程&函数式编程


1、KVO

KVO是均等种植观察者机制,在目标注册监听这晚,在被监听的靶子来转移之早晚,对象见面开车一个通被监听者,以便监听者执行有操作。

  • 运用KVO的要求是目标要能够支持kvc机制——所有NSObject的子类都支持之机制。

规律:KVO的兑现是基于Runtime的。当观察对象A的时刻,KVO机制动态创建一个称也:NSKVONotifying_A的新类,该类继承自对象A,KVO为NSKVONotifying_A重写了setter方法,setter
方法会负责在调用原 setter
方法之前与之后,通知所有观察对象属性值的转情况。

当有类的对象第一不善被观察时,系统即会见于运行期动态地创造该类的一个派出生类,在是派生类中再写基类中另外被观察性的
setter 方法(Person的派生类会是NSKVONotifying_Person)。

派生类在被再写的setter
方法实现真正的通机制,在setter方法里面会去主动的调用willChangeValueForKey和didChangeValueForKey,向系统发生NSKeyValueChangeSetting的通知,然后系统的关照中心,就会见打招呼监听者去调动用observeValueForKeyPath:ofObject:change:context:方法。

以派生类还再次写了class方法,将这目标的isa指针指于这个新出生的派生类,因此这目标就改成该派生类的对象了,因此于该对象上调用setter方法就会调用派生类中更写的setter方法了。此外,派生类还更写了dealloc方法来放资源。

恢宏:isa指针:是一个Class类型的指针,每个实例对象还出isa指针,指于这目标的好像。

KVO的用与否很简短,就是简的3步。
1.登记需要观察的对象的性能addObserver:forKeyPath:options:context:
2.落实observeValueForKeyPath:ofObject:change:context:方法,这个措施当观察的习性变化时会见活动调用
3.注销注册观察removeObserver:forKeyPath:context:

题目:在利用KVO的早晚,如果以并未添加监听的动静下开展观察者移除,会造成程序的崩溃.
当长观察者的下,观察者对象及给观察的性所属之靶子都不见面吃retain,然而在这些目标为放飞后,相关的监听信息也还存,(ARC环境下)KVO做的处理是一直吃程序崩溃。

参考:iOS开发–
KVO的兑现原理与具体行使

2、KVC

KVC
键值编码,就是负iOS开发被可以允许开发者通过key名直接访问对象的性,或者让目标属性赋值,而无需要调用存取方法,这样即便好于运行时动态在造访与改对象的特性。而不是以编译时规定

规律:假设我们着眼一个name属性,那么KVO怎么找到这个name属性呢

  • 1、去模型中找出没有来setname方法,
  • 2、如果无setname方,那么查找出没出name属性
  • 3、如果搜索不交name性,接着以见面失去搜寻_icon属性
  • 4、 如果都摸不顶即会见报错
    [<Flag 0x7fb74bc7a2c0> setValue:forUndefinedKey:]

参考:iOS开发技术系列—详解KVC(我告诉您KVC的全套)
iOS底层-KVC使用实行与落实原理

3、NotificationCenter KVO Delegate 之间的区分

  • 1、NotificationCenter通知,观察者模式,
    通常发送者和接收者的涉是间接的大都对准大多关系
  • 2、KVO
    键值观察,KVO是一个对象能够观察另外一个目标的习性之价,并且会察觉价值的转变
  • 3、Delegate代理,通常发送者和接收者的干是直的一对一底涉嫌。delegate比NSNotification的频率高
通知

NSNotificationCenter以此看似是一个通知中心,使用单例设计,每个应用程序都见面起一个默认的通报中心。用于调度通报之发送的接受

通报中心:实际上是先后中提供的一致种植广播机制。把接收到的信,根据其中的信转发给消息对象
1.每当急需的地方注册要考察的关照
2.在某个地方发送通知
3.变除通知

发送通知的代码

//发送通知的代码

    NSDictionary *dic = @{@"111":@"one",@"222":@"two"};
    /*
     1、通知的名称
     2、通知发送者
     3、附带的信息
     */
    [[NSNotificationCenter defaultCenter]postNotificationName:@"MN_notification" object:self userInfo:dic];


//    - (void)postNotification:(NSNotification *)notification;
//    - (void)postNotificationName:(NSNotificationName)aName object:(nullable id)anObject;
//    - (void)postNotificationName:(NSNotificationName)aName object:(nullable id)anObject userInfo:(nullable NSDictionary *)aUserInfo;

累加观察者

 /**
     参数1:观察者,self代表着控制器
     参数2:接收到通知以后调用的方法
     参数3:通知的名称
     参数4:接受哪一个发送者的通知。nil代表接受所有的通知
     */
    [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(getNotification:) name:@"MN_notification" object:nil];

移除观察者

- (void)getNotification:(NSNotification*)notfication{
    NSLog(@"notfication.userInfo:==%@",notfication.userInfo);
}
Delete

代理要是因为三部分构成:

  • 1、协议:用来指定代理双方可以做呀,必须做什么。
  • 2、代理:根据指定的商议,完成委托方需要贯彻之机能。
  • 3、委托:根据指定的说道,指定代理去好什么力量。

3.1、通知之根实现

通知起星星点点独着力概念:
  • NSNotification:NSNotification是有利NSNotificationCenter广播到外对象时之包裹对象,简单说就通知中心对通报调度表中的对象广播时发送NSNotification对象
  • NSNotificationCenter:NSNotificationCenter是近乎一个广播中心站,使用defaultCenter来获取使用被的通报中心,它可通往以任何地方发送和接受通知。在通知中心注册观察者,发送者使用通知中心广播时,以NSNotification的name和object来确定要发送给何人观察者。为保观察者能接到及通报,所以应先行为通知中心登记观察者,接着再发送通知这样才会以通告中心调度表中查找到呼应观察者进行通报

俺们点击上NSNotification的源码可以看出

E7539156-E4B6-4B0C-83D1-5D2F4069EEF0.png

里主要发生三单特性

  • name:用来标识通知的记
  • object:通知之对象
  • userInfo:存储发送通知时顺手的音
出殡通知
- (void)postNotification:(NSNotification *)notification;
- (void)postNotificationName:(NSNotificationName)aName object:(nullable id)anObject;
- (void)postNotificationName:(NSNotificationName)aName object:(nullable id)anObject userInfo:(nullable NSDictionary *)aUserInfo;

出殡通知通过name和object来确定来标识观察者,name和object少单参数的规则一样便当通告设置name为kChangeNotifition时,那么就会发送给副name为kChangeNotifition的观察者,同理object指发送给有特定目标通知,如果仅仅设置了name,那么只有对诺称的关照会见沾。如果同时装name和object参数时就必以可当下简单独规范的观察者才会接受及通报

观察者
- (void)addObserver:(id)observer selector:(SEL)aSelector name:(nullable NSNotificationName)aName object:(nullable id)anObject;

- (id <NSObject>)addObserverForName:(nullable NSNotificationName)name object:(nullable id)obj queue:(nullable NSOperationQueue *)queue usingBlock:(void (^)(NSNotification *note))block NS_AVAILABLE(10_6, 4_0);
  • 首先种植办法是咱比较常用的长观察者的办法,接受到通报之早晚实施有关职责
  • 次种方式是基于Block来添加观察者,往通知中心的调度表中添加观察者,这个观察者包括一个queue和一个block,并且会回来这个观察者对象。当接受通知时实行block所于的线程为抬高观察者时传出的queue参数,queue也足以为nil,那么block就以通知所在的线程同步施行。
    这里需要小心的是要运用第二种之法门开创观察者需要弱引用可能勾循环引用的对象,避免内存泄漏。

3.2、代理的落实

代理是同一种通用的设计模式,在iOS中针对代理设计模式支持之非常好,有一定的语法来落实代理模式,OC语言可以由此@Protocol心想事成协议

00929D51-E6BF-4D95-9B62-3DA908C9FD29.png

代办第一出于三有组成:

合计:用来指定代理双方可举行什么,必须召开啊。
代理:根据指定的协议,完成委托方需要实现的效能。
寄托:根据指定的商,指定代理去完什么力量。

当iOS中代理的本色就是代理对象内存的传递和操作,我们于委托类设置代理对象后,实际上只是用一个id类型的指针将代理对象开展了一个闭眼引用。委托方让代理方执行操作,实际上是于信托类吃向此id类型指针指向的对象发送信息,而之id类型指针指向的靶子,就是代理对象

270478-46bd127a39be8f28.png

透过地方这张图我们发现,其实委托方的代理属性本质上就是代理对象自我,设置委托代理就是代理属性指针指向代理对象,相当给代理对象只是是当委托方中调用自己的方,如果艺术无兑现就会见促成崩溃。从崩溃的消息达来拘禁,就可以看出来是代理方没有兑现协议被的计导致的倒台。

使议只是是一模一样栽语法,是声称委托方中之代理属性可以调用协议被宣称的法子,而谋中法的兑现还是发生代理方完成,而协议方和委托方都未晓得代理方有没有产生就,也不需要懂得怎么就

怎咱们安代理属性都下weak呢?

俺们定义之指针默认都是__strong类型的,而性本质上啊是一个分子变量和set、get方法结合的,strong类型的指针会造成大引用,必定会影响一个对象的生命周期,这为便会见形成巡回引用。

270478-55bd24c91d59a796.png

高达图中,由于代理对象下大引用指针,引用创建的委托方LoginVC对象,并且变成LoginVC的代理。这就是会见促成LoginVC的delegate属性强引用代理对象,导致循环引用的题目,最终两单对象还心有余而力不足正常释放。

270478-fa0ec90e1f20b05f.png

咱俩以LoginVC对象的delegate属性,设置也死亡引用性。这样于代理对象生命周期是时时,可以健康啊咱办事,如果代理对象被保释,委托方和代理对象都非会见因内存释放导致的Crash。

然而,这样还稍问题,真的不见面崩溃吗?

下两种植艺术还是弱引用代理对象,但是首先栽在代理对象被放出后非见面促成崩溃,而第二栽会造成崩溃

@property (nonatomic, weak) id<LoginProtocol> delegate;
@property (nonatomic, assign) id<LoginProtocol> delegate;

weak以及assign是一律栽“非拥有关系”的指针,通过这有限种修饰符修饰的指针变量,都非会见转让引用对象的援计数。但是在一个对象为放飞后,weak会自动将指针指向nil,而assign则不会见。在iOS中,向nil发送信息时无会见促成崩溃的,所以assign就会见造成野指针的错误unrecognized
selector sent to instance。

为此我们设修饰代理属性,还是用weak修饰吧,比较安全

剪辑:你确实了解iOS代理设计模式吗?你真正了解iOS代理设计模式吗?

4、类别和扩张的区分

  • 1、类别: 在尚未原类.m文件的底子及,给该类添加方法;

  • 2、延展:一种植非常形式之种,主要在一个接近的.m文件里声称与实现延展的图,就是给有
    类添加私有方法可能私有变量。

片个之区别:
  • 1、延展可以上加属性并且她丰富的法子是须要兑现的。延展可以当是一个私家的类目。
  • 2、类别好当不明白,不改动原来代码的状下于内上加新的方,只能添加,不可知去修改。
  • 3、并且使类别和原来类吃的措施来名称冲突,则种将蒙原来的不二法门,因为品种享有双重强之先期级。
  • 4、继承可以长,修改删除方法,添加属性。

Category只能为对象上加方,却休可知补充加成员变量的来由:如果可以加上成员变量,添
加的分子变量没有章程初始化

5、多态

多态说的直接一点就是重写和重载
多态就是父类指针指为子类指针,
先是,子类要继续父类
那么即便子类可以调用父类的物
相当给将父类的事物在子类复写了一样普

这就是说是时段自己当子类把在父类继承过来的之物好写一遍,并且改了累过来方法中的事物

本条时段自己如果调用父类的指针调用子类对象的计,就会见首先在子类里面找,找到后虽打印出来,如果没有找到就会见于父类里面找,然后打印出来。

当时之中要子类自己长方法,而父类没有,就不可知调用,因为父类里面没有。
也就是说父类和子类的主意而依次对应。

父类可以长方法,而子类自己多,就算是和谐加,父类指针也未能够调用新增的计。

6、单例模式了解和利用

单例模式之图

足管在程序运行过程,一个好像才生一个实例,而且该实例易于供外界看
于是方便地操纵了实例个数,并节约系统资源。在总体应用程序中,共享一卖资源(这卖资源只需要创造初始化1涂鸦),一般用来工具类。例如:登陆控制器,网络数据要

优点:

单例模式可以保证系统中一个类似才发一个实例而且该实例易于外界看,从而便利对实例个数的决定并节约系统资源。
要是希望在系面临有类的靶子只能在一个,单例模式是极度好的解决方案。
单例模式因为接近控制了实例化过程,所以类似可进一步灵敏修改实例化过程。

缺点:

单例对象要成立,对象指针是保存于静态区之,单例对象在积中分红的内存空间,会当应用程序终止后才会为保释。
单例类无法继续,因此好为难展开类似的扩张。
单例不适用于变化的靶子,如果同档的对象总是要当不同的用例场景发生变化,单例就会招数据的失实,不能够保存彼此的状态。

单例在ARC中的贯彻
+(instancetype)shareManager{
  //类对象
    static MNDownLoad * dle = nil;

    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{

        dle = [[MNDownLoad alloc] init];

    });
    return dle;
}

参考:iOS之单例模式初探
iOS-单例模式写一不行就是足够了

7、沙盒的明

沙盒机制

iOS
APP可以于融洽的沙盒里读写文件,但是,不得以看其他APP的沙盒。每一个APP都是一个信息孤岛,相互是未可以展开通信的,唯独可以由此URL
Scheme。沙盒里面的公文可以是相片、声音文件、文本、属性列表等。

沙河盒根目录的组织
  • Documents:用于存储用户数据,iTunes备份和恢复的当儿会包含此目录。所以,苹果建议用顺序中成立的抑以先后中浏览到之数额保存在该目录下
  • Library
    • Caches :Caches用来存放用户要转移成的文本
    • Preferences
      :Preferences是APP的惯设置,可以经NSUserDefaults来读取和安
  • tmp:用于存放临时文件,这个可放有当APP退出后不再用的文件。

2348494-e0a5c4bac14d0d27-1.png

参考:http://www.jianshu.com/p/349855b5a8ae

8、Runloop

Runloop 就是运行循环
作用

  • 1.展一个常驻线程(让一个子线程不上没有状态,等待其他线程发来消息,处理该
    他事件
  • 2.于子线程中启一个定时器
  • 3.以子线程中进行一些漫漫监控。
  • 4、可以操纵定时器在一定模式下实施
  • 5、可以吃某些事件(行为、任务)在一定模式下实施
  • 6、可以加加Observer监听RunLoop的状态,比如监听点击事件之处理(在具备点击事件
    之前举行有工作)

她里面就是do-while循环,在是轮回之中不断地处理各种任务

为什么而运RunLoop,一般景象下我们是从来不必要失去启动线程的RunLoop,除非需要以一个单独的线程长久的检测某个事件

两个API

率先使知iOS里面有些许模拟API可以拜同下RunLoop

  • 1、Foundation -> NSRunLoop
  • 2、Core Foundation -> CFRunLoopRef

上面两法都足以利用,但是若懂得CFRunLoopRef是为此c语言写的,是开源之,相比叫NSRunLoop更加底层,而NSRunLoop其实是指向CFRunLoopRef的一个粗略的包装。便于使用而已。这样说来,显然CFRunLoopRef的习性要大一些。

RunLoop相关类

Core Foundation中发出RunLoop的五只类似

  • CFRunLoopRef
  • CFRunLoopModeRef
  • CFRunLoopSourceRef
  • CFRunLoopTimerRef
  • CFRunLoopObserverRef

CFRunLoopModeRef
CFRunLoopMode的要紧意图是 指定事件于任务中之事先级

  • kCFRunLoopDefaultMode //App的默认Mode,通常主线程是于此Mode下运行

  • UITrackingRunLoopMode //界面跟踪 Mode,用于 ScrollView
    追踪触摸滑动,保证界面滑动时不被外 Mode 影响

  • UIInitializationRunLoopMode // 在刚刚起步 App 时先后进入的率先个 Mode,启动完成后即不再用

  • GSEventReceiveRunLoopMode // 接受系统事件的里边 Mode,通常用无交

  • kCFRunLoopCommonModes //这是一个占位用之Mode,不是一致栽真正的Mode

苹果公开提供了点滴单mode
  • NSDefaultRunLoopMode,NSDefaultRunLoopMode被补充加至主运行循环中的时,scrollView滚动的进程被会以mode的切换,导致NSTimer不为调用
  • NSRunLoopCommonModes

CFRunLoopSourseRef

CFRunLoopSourseRef是事件源,分为两种

  • sourse0:非基给port的 (port相当于是系统),自己写的章程,响应
  • sourse1:基于port的,系统提供的

CFRunLoopObserverRef
CFRunLoopObserver是观察者,可以监听runLoop的状态改变

好监听的时接触发出以下几独

  • kcfRunLoopEntry(即将上loop)
  • kcfRunLoopBeforeTimers(即将处理timer)
  • kcfRunLoopBeforeSources(即将处理source)
  • kcfRunLoopBeforeWaiting(即将上休眠)
  • kcfRunLoopAfterWaiting(刚由休眠中唤醒)
  • kcfRunLoopExit(即将退出loop)
runloop的定时源和输入源

Runloop处理的输入事件有半点种植不同的来自:输入源(input source)和定时源(timer
source)

  • 输入源传递异步消息,通常来自于任何线程或者程序
  • 定时源则传递同步消息,在特定时间还是自然的日子间隔发
runloop 和线程的涉及

主线程的run loop默认是启动之。
UIApplicationMain()函数,这个方法会为mainthread设置一个NSRunLoop对象,
这虽分解了:为什么咱们的利用可以当无人操作的时刻休息,需要吃它们干活的当儿还要会马上响应

参考:深入了解RunLoop
IOS—实例化讲解RunLoop

9、深浅拷贝

浅复制(copy):只复制指向对象的指针,而未复制引用对象自我
深复制(mutableCopy):复制引用对象自我。深复制就哼理解了,内存中留存了点滴份独立对象自我,
当修改A时,A_copy不变

295346-bd95431918be69b1.png

问题
  • 1、向一个继承NSObject的目标直接copy会发生什么

  • 2、property里的copy、strong区别

问题1:向一个继往开来NSObject的目标直接copy会发生什么

答:会崩溃
倒信息

reason: '-[Dog copyWithZone:]: unrecognized selector sent to instance 0x60000001d6e0'

从定义之近乎非克直接采用copy、mutableCopy需要更写copyWithZone:和mutableWithZone:方法来形成实际的复制工作,否则会报错:

解决:

  • (1)、让该类实现NSCopying协议;
  • (2)、让该类实现copyWithZone:方法。
问题2:property里的copy、strong区别

理解这题目不怕需要小心一下老三个属性

@property (nonatomic,copy)NSString *name1;

@property (nonatomic,strong)NSMutableString *name2;

@property (nonatomic,copy)NSMutableString *name3;

其中对@property (nonatomic,copy)NSMutableString *name3;的价值进行修改的早晚,会倒,因为实际里面或

- (void)setName3:(NSMutableString *)name3
{
    _name3 = [name copy];
}

copy出来的照样是不行变字符!如果有人用NSMutableString的办法,就会倒。而strong只有是大引用,引用计数➕1
参考:iOS
浅谈:深.浅拷贝与copy.strong
Demo地址

10、向一个空对象发送事件

第一我们用事先普及几个概念nil Nil NULL NSNull

  • nil和C语言的NULL相同,在objc/objc.h中定义。nil表示Objective-C对象的值为空。在C语言中,指针的空值用NULL表示。在Objective-C中,nil对象调用任何措施表示什么吧不执行,也不会见倒

  • Nil:那么对于我们Objective-C开发以来,Nil也便意味着((void
    *)0)。但是她是用来代表空类的. 比如:Class myClass = Nil;

  • NULL: 在C语言中,NULL是无类型的,只是一个极大,它意味着空.
    这即是在C/C++中的空指针。对于咱们Objective-C开发来说,NULL就代表((void*)0).

  • NSNull:NSNull是延续给NSObject的类别。它是十分突出之好像,它象征是空,什么吗未存储,但是它们也是目标,只是一个占位对象。使用状况就是非一样了,比如说服务端接
    又遇为咱们以值为空时,传空。NSDictionry *parameters = @{@”arg1″ :
    @”value1″,@”arg2″ : arg2.isEmpty ? [NSNull null] : arg2};
区别
  • NULL是宏,是对于C语言指针而下的,表示空指针
  • nil是宏,是对此Objective-C中的目标要利用的,表示对象啊空
  • Nil是宏,是于Objective-C中的近乎设以的,表示类指向空
  • NSNull是类类型,是用于表示空的占位对象,与JS或者服务端的null类似的含意
向一个nil发送事件会产生啊
  • 望nil发送信息是截然可行之——只是以运转时莫会见生另企图
  • 设若一个智返回值是一个目标,那么发送给nil的音讯将返回回0(nil)
  • 假定措施返回值为指针类型,其指针大小为小于或者当sizeof(void*),float,double,long
    double 或者long long的整型标量,发送给nil的消息将回来回0

11、MVC&MVVM

MVC

MVC全称是Model View Controller ,是千篇一律种植模型 (model)-视图 (view)-控制器
(controller)
的缩写。MVC是主流的客户端的编程框架,但是用于大气的作业逻辑都汇集在contriller中,往往会造成我们的Controller
过于 臃肿,其实是题材我们得以根据分类 或者有些
不是因congroller的法摘出来等方式解决是题材

MVVM

MVVM 是 Model-View-ViewModel
的简写。相对于MVC,MVVM是一个较新的框架结构,这个2005年微软提出的如出一辙栽架构思路

model层,API请求的原数据
view层,视图显示,由viewController来控制
viewModel层,负责作业处理及多少转发

MVVM在使中通常会利用双向绑定技术,使Model变化时ViewModel会自动更新,而
ViewModel 变化时,View 也会自行生成

缺点

  • 数绑定使得 Bug 很不便被调剂。你瞧界面异常了,有或是公 View
    的代码来 Bug,也或是 Model 的代码来问题。数据绑定使得一个职的
    Bug 被迅速传递到别的位置,要定点本来出问题之地方即变得不那么容易了。
  • 对此过怪的色,数据绑定需要花还多之内存。
  • ReactiveCocoa
RAC
  • RAC核心思想:就是事件有后作出响应
  • 骨干概念:信号Signal和 订阅者Subscriber
  • 所召开的政工:就是故信号接管iOS中兼有的波
    • target事件
    • delegate代理事件
    • KVO监听事件
    • 通知

RACSignal

  • 信号
  • 欲订阅者,没有订阅者就是冷信号
  • subscription(订阅)
    • subscribeNext
    • SubscribeError
    • SubscribeCompleted

RACSubscriber

  • 订阅者
  • sendNext 通知订阅者有监听事件,并且通过X传递监听目标
  • senfError 通知订阅者出现谬误
  • SendCompleted 通知订阅者监听完成

RACDisposable

  • 信号处理
  • 信号结束后外存销毁工作

12、UIWebView和JS交互&WKWebVieW和JS交互

原理

JavaScriptCore常用之好像

  • 1、JavaScriptCore作用:JavaScriptCore是苹果原生API,用来JS和OC交互的。
  • 2、JSContext:
    JS运行条件,用它们去实践JS代码,并且通过它失去取得JS里之多少
  • 3、JSValue: 用于收纳JS中获得之数据类型,可以是无一靶,方法

OC调用JS
真相:JS代码中已经定义好变量和办法,通过OC去取得,并且调用
步骤

  • 1、创建JS运行环境

JSContext *ctx = [[JSContext alloc] init];
  • 2、执行JS代码

[ctx evaluateScript:jsCode];
  • 3、获取JS数据(变量,方法)

// 因为变量直接定义在JS中,所以可以直接通过JSContext获取,根据变量名称获取,相当于字典的Key
    // 只有先执行JS代码,才能获取变量
    JSValue *jsArr = ctx[@"arr"];
  • 4、使用JS数据,方法

JS调用OC方法
一致开始JS中连不曾OC的block,所以没法直接调用OC的block,需要将OC的block,在JS中生成道,然后在通过JS调用。
步骤

  • 1、创建JS运行条件

 // 创建JS运行环境
    JSContext *ctx = [[JSContext alloc] init];
  • 2、在JS中生成对应的OC代码

    ctx[@”eat”] = ^(){
    由于JS本身并未OC这个代码,需要让JS中赋值,就会自动生成右边的代码
    一定给当JS中定义一个叫eat的法门,eat的落实就是block中的实现,只要调用eat,就会见调用block
    NSLog(@”吃东西”);
    };

  • 3、使用JS调用,在JS环境受到生成的block方法,就能够调用到OC的block中.

// JS执行代码,就会直接调用到block中
    NSString *jsCode = @"eat()";
    [ctx evaluateScript:jsCode];
UIWebView和JS交互
OC调用JS方法

咱们要以网页加载成功之后,注入我们的JS代码

-(void)webViewDidFinishLoad:(UIWebView *)webView  
{  
    //网页加载完成调用此方法  

    //首先创建JSContext 对象(此处通过当前webView的键获取到jscontext)  
    JSContext *context=[webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];  
    NSString *alertJS=@"alert('test js OC')"; //准备执行的js代码  
    [context evaluateScript:alertJS];//通过oc方法调用js的alert  

}  
JS调用OC

先是创建一个类 继承NSObject 并且规定一个协商< JSExport >
接下来我们得以当商议被写上JS调用OC的点子

//首先创建一个实现了JSExport协议的协议  
@protocol TestJSObjectProtocol <JSExport>  

//此处我们测试几种参数的情况  
-(void)TestNOParameter;  
-(void)TestOneParameter:(NSString *)message;  
-(void)TestTowParameter:(NSString *)message1 SecondParameter:(NSString *)message2;  

@end

weibview加载完成以后流入js代码
参考文献:
iOS js
oc相互调用(一)
iOS js
oc相互调用(JavaScriptCore)(二)

WKWebVieW和JS交互

1、JS调用OC方法

  • 1、添加处理脚本

WKUserContentController *userCC = config.userContentController;
//JS调用OC 添加处理脚本
[userCC addScriptMessageHandler:self name:@"showMobile"];
  • 2、走代理方

- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message 

2、OC调用JS方法

/*
     *alertName('奥特们打小怪兽')
     *alertName JS方法名
     *奥特们打小怪兽 带的参数
     */
    [self.webView evaluateJavaScript:@"alertName('奥特们打小怪兽')" completionHandler:nil];

参考文献
WKWebView详解&WKWebVieW和JS交互
demo

13、POST&Get 请求

Http定义了和服务器交互的不等措施,最核心的方式来4栽,分别是GET,POST,PUT,DELETE。URL全称是资源描述符,我们得以这么看:一个URL地址,它用于描述一个网及的资源,而HTTP中之GET,POST,PUT,DELETE就针对承诺着对这资源的查看,改,增,删4独操作。

区别

  • 1、GET(从服务器获取),POST(向服务器发送请求数据)GET不会见变动服务器里的多寡,而POST则一般会转移数据
  • 2、GET是幂等的,POST非幂等,幂等函数,或挂等办法,是据好以相同参数还执行,并能获一致结果的函数。这些函数不见面影响系状态,也非用担心又执行会指向网造成改变。
  • 3、GET请求:参数在地点后拼接,没有要数据,不安全(因为兼具参数还凑合在地方后),不符合传输大量数(长度有限量,为1024个字节)。POST请求:参数在求数据区放正,相对GET请求重安全,并且数据大小没有范围。把提交的数据放置于HTTP包的包体<request-body>中.

14、栈&堆

  • 管住章程:对于栈来讲,是由于编译器自动管理,无需我们手工控制;对于堆来说,释
    放工作由程序员C语言控制,容易生出内存泄露

  • 报名大小

    • 仓库:在Windows下,栈是向低地址扩展的数据结构,是如出一辙片连续的内存的区域。
      这句话的意思是栈顶的地点与货栈的极致充分容量是网预先规定好的,在Windows
      下,栈的尺寸是2M(也有的就是1M,总的是一个编译时虽确定的常数),如
      果申请的上空超过栈的剩下空间时,将唤起
      overflow。因此,能由仓库获得的空 间较小。
    • 堆放:堆是向高地址扩展的数据结构,是不总是的内存区域。这是由系统是用
      链表来存储的空内存地址的,自然是勿连续的,而链表的遍历方向是由低地
      址向大地址。堆的深浅受限于电脑体系中有效之虚拟内存。由此可见,堆得
      得的长空比较灵敏,也正如深
  • 散问题:对于堆来讲,频繁的new/delete势必会造成内存空间的非总是,从而造成大量的碎
    片,使程序效率下降。对于栈来讲,则无会见满怀于斯
    问题,因为栈是先进后出的队
    列,他们是这般的依次对应,以至于永远都非可能发一个舅存块从仓库中间弹出

  • 分配办法:
    堆都是动态分配的,没有静态分配的积聚。栈有2种植分配办法:静态分配和动态分配。
    静态分配是编译器完成的,比如部分变量的分配。动态分配由
    alloc函数进行分配,
    但是仓的动态分配和堆是不同的,他的动态分配是出于编译器进行释放,无需我们手工
    实现。

  • 分红效率:
    栈是机系统提供的数据结构,计算时以脚对仓提供支持:分配专门的寄存器存
    放栈的地址,压栈出库都有专门的一声令下执行,这就控制了库房的
    效率比较高。堆则是 C/C++函数库提供的,它的建制是死复杂的

外存分区情况

代码区:存放函数二上前制代码
数据区:系统运转时申请外存并初始化,系统退出时出于网放,存放全局变量、静态变量、常量
堆区:通过malloc等函数或new等操作符动态申请获取,需程序员手动申请以及放
栈区:函数模块内提请,函数结束时出于网活动释放,存放有变量、函数参数

15、property属性的修饰符的意向

  • readwrite 是可读而写特性;需要生成getter方法和setter方法;
  • readonly 是单纯念特性 只见面生成getter方法 不见面生成setter方法
    ,不愿意属性在类外改变;
  • assign 是赋值特性,setter方法将盛传参数赋值给实例变量;仅装变量时;
    assign用于简单数据类型,如NSInteger,double,bool;
  • retain
    表示拥有特性,setter方法将盛传参数先保留,再赋值,传入参数的援计数
    retaincount会+1;
  • copy
    表示赋值特性,setter方法将盛传对象复制一卖;需要了平等客新的变量时;
  • nonatomic 非原子操作,决定编译器生成的setter getter是否是原子操作;
  • atomic表示多线程安全,一般采用 nonatomic

15.1、iOS 属性中strong,weak,assign,retain,copy等特性

  • assign用于简单赋值,不另行改索引计数
    对基础数据类型 (例如NSInteger,CGFloat)和C数据类型(int, float,
    double, char, 等)适用简易数据类型

  • retain:引用计数加相同,
    此属性只能用来Objective-C对象类型,而无能够用于Core Foundation对象。

  • copy:引用计数加同,在赋值时采取传入值的一致卖拷贝。

  • 强变量(strong)
    一定给老版本的retain,而且可以不再用做release操作了
    倘出胜变量的援,对象就是不见面释放内存

  • 弱变量(weak)
    一定给老版本的assign。但是单纯适应被对象
    当弱变量引用的目标为别的变量释放,那么弱变量会让机关安装为nil,这样可以使得地防崩溃

16、多线程

多线程

差不多线程大概有四栽

  • 1、Pthreads
  • 2、NSThread
  • 3、GCD
  • 4、NSOperation & NSOperationQueue
NSThread

NSThread是苹果封装的,面向对象的,可以直接操控线程的靶子,但是得我们手动管理对象的生命周期,我们无常下,但是[NSThread currentThread]它们可拿走当前线程类,你就算得清楚当前线程的各种性能,用于调试好有利于

GCD

GCD是苹果也多对的竞相运算提出的缓解方案,能够行得通之行使CPU内查处,能够团结管理对象的生命周期,是C语言写的

GCD有少单核心概念

  • 1、队列:用于存放任务。一共发零星栽队列, 串行队列 和 并行队列
  • 2、任务:想要推行之风波

队列

  • 1、主队列:它用来刷新 UI,任何要刷新 UI
    的劳作都要于主队列执行.[dispatch_get_mian_queue()]
  • 2、全局队列:这是一个互队列,我们创建的富有并行队列都得放倒里面[dispatch_get_gold_queue()]
  • 3、串形队列
  • 4、并履行队列
NSOperation & NSOperationQue

NSOperation 是苹果店对 GCD 的包裹,完全面向对象,NSOperation 和
NSOperationQueue 分别指向承诺 GCD 的 任务 和 队排

  • 1、将要执行的天职封装到一个 NSOperation 对象中
  • 2、将这个任务添加到一个 NSOperationQueue 对象被。

NSOperation 只是一个抽象类,所以未能够封装任务,但它产生 2
只子类用于封装任务。分别是:NSInvocationOperation 和 NSBlockOperation
。创建一个 Operation 后,需要调用 start 方法来启动任务,它见面
默认在当前行同步实施。当然你也可于半路取消一个职责,只需要调用其
cancel 方法即可

  • NSOperationQueue 有一个参数 maxConcurrentOperationCount
    最可怜并发数,用来设置极端多可吃多少只任务而实施
问题
  • 1、为什么自己的品种被经常使用GCD,但是大牛们开源的老三在一般会动用NSOperation
  • 2、 谈谈线程安全题材的几乎种缓解方案
  • 3、如何实现线程同步
  • 4、多线程的补益与缺点
怎么自己的种类蒙时常应用GCD,但是大牛们开源的老三着一般会使用NSOperation
  • 1、NSOpertaionQueue用GCD构建封装的,是GCD的高档抽象
  • 2、NSOperationQueue中的队可以叫还安优先级,从而实
    现不同操作的尽顺序调整。GCD不支持异步操作中的倚重关系设置。如果有操作的依
    赖另一个操作的数(生产者-消费者模型是其中有),使用NSOperationQueue能够以
    正确的相继执行操作。GCD则没内建的依关系支持
  • 3、NSOperationQueue支持KVO,意味着我们得以洞察任务之履状态

否啥我们下GCD,因为简单,呵呵哒

座谈线程安全题材的几乎种植缓解方案

解决方案: 使用锁:
锁是线程编程同步工具的底子。锁得于你十分爱保障代码中千篇一律深
块区域以便你可以确保代码的不易。

  • 1、 使用NSLock类;
  • 2、使用@synchronized指令等
怎么贯彻线程同步

线程同步:1块资源或会见于多只线程共享,也便是大抵独线程可能会见造访同一块资源,比如多单线程访问与一个靶、同一个变量、同一个文件。当多独线程访问同片资源时,很轻引发多少错乱和多少安全题材

解决方案就是加锁

大多线程的利益以及缺点
  • 好处

    • 应用线程可以把占时间长的程序中之任务放到后台去处理
    • 用户界面可以更进一步吸引人口,这样按用户点击了一个按钮去碰某些事件之拍卖,可以弹出一个快漫长来展示处理的进度
    • 次第的运转效率可能增强
    • 当有的待的任务实现达标一旦用户输入、文件读写及网收发数据等,线程就比较有因此了
  • 缺点

    • 一旦出恢宏之线程,会潜移默化性,因为操作系统需要在它之间切换
    • 重复多之线程需要再行多的内存空间。
    • 线程的中止需要考虑其对程序运行的影响。

16.1、GCD的底色实现

Parse的多线程处理思路/Parse的最底层多线程处理思路
深深了解 GCD

17.1、线程死锁问题

布拉布拉说勿要命堆也未尝同张图书的知情,先上一致布置图,然后以分解

1854490-7a0dcaf4513cfddd.png

C97CE20A-B58D-4D1D-8223-4E76760956C9.png

剖析:其实看路面临代码,最要害的尽管是任务3和任务4,其中在dispatch_async异步队列中,任务添加顺序是任务2-->任务4-->任务3,但是队列顺序是任务2-->任务3-->任务4,所以任务4是在任务3的前面,但是队列里任务3是在任务4的前面

参考:
iOS陆哥付出笔记(八)
(GCD死锁及缓解方案)
一样首专题为你秒懂GCD死锁问题!
Demo地址

17、线程安全&线程同步

线程安全问题概括个别个点:1、线程死锁。2、线程同步,线程死锁我们于方介绍了了,这里关键介绍线程同步

保线程同步的法门
  • 1、@synchronized
  • 2、dispatch_semaphore
  • 3、NSLock

法发生无数,这里就是概括说一下广阔的3种状态吧

@synchronized

@synchronized使用起来比较简单,但是缺点是效率不如

NSObject *obj = [[NSObject alloc] init];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    @synchronized(obj) {
       NSLog(@"需要线程同步的操作1 开始");
       sleep(3);
       NSLog(@"需要线程同步的操作1 结束");
    }
});
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    sleep(1);
    @synchronized(obj) {
       NSLog(@"需要线程同步的操作2");
    }
});

@synchronized(obj)指令下的obj为该锁的唯一标识,只有当标识相同时,才为满足互斥,如果线程2吃的@synchronized(obj)改也@synchronized(self),刚线程2就未见面被封堵,@synchronized指令实现锁之长处就是是咱无需在代码中显式的创立锁对象,便得以兑现锁之机制

dispatch_semaphore信号量

dispatch_semaphore信号量,主要是控制GCD的并发数,里面有三独重点的定义

  • dispatch_semaphore_create 创建一个semaphore
    创立一个整形数值的信号,即:信号的总量

dispatch_semaphore_t signal = dispatch_semaphore_create(1);
  • dispatch_semaphore_signal 发送一个信号,让信号总量多1

dispatch_semaphore_signal(signal);
  • dispatch_semaphore_wait 等待信号
    此函数会使传入的信号量dsema的价值减1;这个函数的意向是这样的,如果dsema信号量的值大于0,该函数所处线程就继续执行下面的言辞,并且以信号量的价减1;如果desema的值为0,那么是函数就短路时线程等待timeout(注意timeout的种也dispatch_time_t,不克直接传入整形或float型数)

dispatch_semaphore_t signal = dispatch_semaphore_create(1);
    dispatch_time_t overTime = dispatch_time(DISPATCH_TIME_NOW, 3 * NSEC_PER_SEC);
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        dispatch_semaphore_wait(signal, overTime);
        NSLog(@"需要线程同步的操作1 开始");
        sleep(2);
        NSLog(@"需要线程同步的操作1 结束");
        dispatch_semaphore_signal(signal);
    });
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        sleep(1);
        dispatch_semaphore_wait(signal, overTime);
        NSLog(@"需要线程同步的操作2");
        dispatch_semaphore_signal(signal);
    });
NSLock
NSLock *lock = [[NSLock alloc] init];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    //[lock lock];
    [lock lockBeforeDate:[NSDate date]];
    NSLog(@"需要线程同步的操作1 开始");
    sleep(2);
    NSLog(@"需要线程同步的操作1 结束");
    [lock unlock];
});

NSLock是Cocoa提供被我们最好中心的沿对象


【这里以引进几首比较漂亮之稿子】

OC最实用的runtime总结,面试、工作而看我不怕够了!
runtime详解
Runtime
10种用法(没有比较这重复净的了)

深刻明RunLoop
RunLoop入门 看自己就算够用了
RunLoop
总结:RunLoop的以场景(一)
RunLoop
总结:RunLoop的使场景(二)
RunLoop总结:RunLoop的下场景(三)
RunLoop总结:RunLoop的采取场景(四)
RunLoop总结:RunLoop的应用场景(五)

关于iOS多线程,你看自己不怕足足了
iOS多线程–彻底学会多线程之『GCD』

网基础知识
深入浅出-iOS的TCP/IP协议族剖析&&Socket
有关iOS socket都当此处了
iOS网络HTTP、TCP、UDP、Socket
知识总结

Xcode 8 Instruments
学习(一)
Xcode 8 Instruments
学习(二)
Xcode 8 Instruments
学习(三)
Xcode 8 Instruments
学习(四)
Xcode 8 Instruments 学习(五)

不断更新中…