当前位置:必发365电子游戏 > 操作系统 > 必发365电子游戏指定一个被观察的对象的属性,3.2、代理的实现
必发365电子游戏指定一个被观察的对象的属性,3.2、代理的实现
2019-12-19
因为白天都有业务,所以平时独有凌晨会计算一下,里面有那多少个不客观的地点,迎接提出。因为水平有限,好些都是看的外人写的比较好的小说,里面假使用外人文章之处上边都写有参照他事他说加以考查。要是有痛认为蒙受入侵的小编,能够与自己关系,作者当下去除。谢谢

1.KVO
1.1> KVO 简介:
KVO 是 OC 观看者设计格局的朝气蓬勃种达成.KVO 钦赐一个被寓指标对象的质量,当该属性发生变化时,观看者会吸收接纳公告,并作出相应管理.

目录:

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、分裂应用软件在此以前是怎么相互传值的
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.2>KVO 完结原理:
KVO 是因此 Runtime 机制达成的,当旁观某指标A时,KVO机制动态创制多少个目的A当前类的子类NSKVONotifying_A,并为那个新的子类重写了被考察属性keyPath的setter 方法。setter 方法随后肩负通告观望对象属性的修正风貌。

1、KVO

KVO是风华正茂种观看者机制,在目的明册监听那后,在被监听的靶子产生改造的时候,对象会驾乘二个布告给监听者,以便监听者实行一些操作。

规律:KVO的落到实处是基于Runtime的。当阅览对象A的时候,KVO机制动态创造二个名称为:NSKVONotifying_A的新类,该类世襲自对象A,KVO为NSKVONotifying_A重写了setter方法,setter 方法会负担在调用原 setter 方法早先和今后,布告全部旁观对象属性值的改造意况。

当有个别类的对象第贰遍被考察时,系统就能够在运转期动态地创设该类的一个派生类,在这里个派生类中重写基类中任何被调查属性的 setter 方法(Person的派生类会是NSKVONotifying_Person)。

派生类在被重写的setter 方法达成真正的照料机制,在setter方法里面会去主动的调用willChangeValueForKey和didChangeValueForKey,向系统一发布出NSKeyValueChangeSetting的通报,然后系统的通报中央,就能够通报监听者去调用observeValueForKey帕特h: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情状下卡塔尔(英语:State of Qatar)KVO做的管理是一贯让程序崩溃。

参考:iOS开采-- KVO的兑现原理与具体应用

子类setter方法剖判:KVO的键值观望通告重视于 NSObject 的四个主意:willChangeValueForKey:和didChangevlueForKey:,在存取数值的左右分别调用2个章程:
被观望属性爆发转移以前,willChangeValueForKey:被调用,公告系统该 keyPath 的属性值就要转移;当改变产生后, didChangeValueForKey: 被调用,通告系统该 keyPath 的属性值已经转移;之后, observeValueForKey:ofObject:change:context: 也会被调用。且重写观望属性的setter 方法这种持续方式的流入是在运作时并非编写翻译时落实的。

2、KVC

KVC 键值编码,就是指iOS开垦中得以允许开拓者通过key名直接待上访谈对象的天性,可能给目的属性赋值,而不供给调用存取方法,那样就可以在运营时动态在做客和退换对象的性质。并非在编写翻译时规定

原理:假诺大家入眼三个name属性,那么KVO怎么找到那几个name属性呢

参考:iOS开垦技巧连串---精解KVC(笔者报告您KVC的方方面面卡塔尔(قطر‎
iOS底层-KVC使用进行以致落到实处原理

1.注册观察者;
2.实现属性值变化时获取通知的方法;
3.移除观察者.

3、NotificationCenter KVO Delegate 之间的区分

必发365电子游戏 1

通知

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);
}

KVO 的选用办法

Delete

代理第风度翩翩由三片段构成:

2.KVC
2.1>KVC 简要介绍: KVC(Key Value Code卡塔尔国,键值编码的简单称谓.KVC不难的话,便是操作贰个指标,能够像操作字典同样,通过key来取值和赋值.

3.1、布告的平底完成

2.2>KVC 流程:
用KVC取值或赋值时,会事情未发生前找这一个天性对应的getter或setter方法来对那个天性赋值
倘使找不到,则会招来心悸划线的质量,借使找到则赋值
假诺还是找不到,则会招来不风疹划线的属性,假使找到则赋值
万一还是找不到,则抛出十三分

照会有四个主导概念:

小编们点击进入NSNotification的源码能够看看

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

在那之中首要有多个属性

用KVC时传出的key必得保障类中存在同名的属性.不然会运作时崩溃.那时候得以在类中重写setValue: forUndefinedKey:

出殡布告
- (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参数时就非得同不常间合乎那五个规范的旁观者技巧选择到布告

2.3>使用 KVC 的好处:

观察者
- (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);

2.3.1 能够访谈对象的个体变量;
2.3.2 能够火速字典转模型. [model setValuesForKeysWithDictionary:dic];

3.2、代理的贯彻

代办是后生可畏种通用的设计方式,在iOS中对代理设计情势扶持的很好,有一定的语法来贯彻代理形式,OC语言能够通过@Protocol兑现公约

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

代理第生龙活虎由三局部构成:

协调:用来钦点代理双方能够做什么,必须做什么。
代办:依照钦点的磋商,完毕委托方要求贯彻的意义。
信托:依照钦命的公约,内定代理去做到什么效果。

在iOS中代理的实质正是代理对象内部存款和储蓄器的传递和操作,大家在委托类设置代理对象后,实际上只是用三个id类型的指针将代理对象开展了一个弱援用。委托方让代理方推行操作,实际上是在委托类中向那么些id类型指针指向的目的发送音信,而那么些id类型指针指向的靶子,正是代理对象

270478-46bd127a39be8f28.png

通过上面那张图大家发掘,其实委托方的代理属性本质上正是代理对象自己,设置委托代理正是代理属性指针指向代理对象,相当于代理对象只是在委托方中调用自身的不二诀要,即使措施未有完成就能够招致崩溃。从崩溃的音讯上来看,就能够看出来是代理方未有贯彻合同中的方法导致的咽气。

而公约只是大器晚成种语法,是宣称委托方中的代理属性能够调用左券中声称的形式,而合同中方法的兑现依然有代理方达成,而左券方和委托方都不清楚代理方有未有成就,也无需掌握如何是好到

必发365电子游戏 2

必发365电子游戏,何以大家设置代理属性都接收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代理设计情势吗?

KVC 的行使办法

4、体系和强盛的区分

3.内部存款和储蓄器管理
iOS 的内存管理分为 ARC 与 MRC三种情势.当前主流的为 ARC 情势.ARC 的真相是 MRC, 只不过是系统协助开采者管理创造的指标或内部存款和储蓄器空间.

五个的分别:

Category只好为目的加多方法,却无法加多成员变量的原故:尽管得以加上成员变量,加多的分子变量未有章程早先化

MRC 下的机要字总结:alloc,retain,copy,release,autorelease, 在这之中,alloc,retain,copy会将引用计数器 +1, release 和 autorelease 会将援引流量计 -1;

5、多态

多态说的直接一点就是重写和重载
多态就是父类指针指向子类指针,
第风华正茂,子类要世袭父类
那么就子类能够调用父类的东西
一定于把父类的东西在子类复写了二遍

那正是说这时候笔者在子类把在父类继承过来的的事物自个儿写三遍,况兼改了一而再一而再再而三过来方法里面包车型地铁事物

以当时候自身要调用父类的指针调用子类对象的方法,就会率先在子类里面查找,找到之后就打字与印刷出来,若无找到就能在父类里面查找,然后打字与印刷出来。

那中间假若子类本人扩大方法,而父类未有,就不能够调用,因为父类里面没有。
也正是说父类和子类的方法要挨个对应。

父类能够追加方法,而子类本人扩张,就到底和睦扩充,父类指针也不可能调用新添的诀窍。

iOS 选取援引流速计的方法管理内部存款和储蓄器,援用计数器是对一块内部存款和储蓄器地址的全体权的记录.当一块内部存款和储蓄器被开荒的时候,援用流速计为 1,在那件事后,每有二个新的指针指向该内部存款和储蓄器,则援用流速計的值 +1,当有些指针不指向该内部存款和储蓄器地址时,该内部存储器地址的引用流速計-1.当内存地址的援引流速計变为 0的时候,系统会释放该内部存款和储蓄器地址.

6、单例形式掌握与行使

深拷贝和浅拷贝
copy语法的目的:改变副本的时候,不会影响到源对象;
深拷贝:内容拷贝,会产生新的对象。新对象计数器置为1,源对象计数器不变;
浅拷贝:指针拷贝,不会产生新的对象。源对象计数器+1.
注:要实现 copy, 必须实现<NSCopying>协议
只有不可变对象调用copy方法时为浅拷贝,其他情况均为深拷贝;
单例情势的功用

能够保障在程序运维进程,一个类唯有贰个实例,并且该实例易于供外部访问
由此利于地调节了实例个数,并节约系统能源。在整整应用程序中,分享大器晚成份财富(那份财富只供给成立初步化1次),日常用来工具类。举例:登录调整器,网络数据央求

4.socket
5.蓝牙
6.runtime
7.isa
8.数据库
9.多线程
10.修饰符(retain,copy,strong...)
11.http,https,TCP/IP
12.加密(AES,MD5...)
13.包体量优化
14.手势冲突
15.SDWebImage 缓存机制
16.推送
17.版本适配
18.AutoLayout
19.Swift 3.0
20.公约代理
21.block
22.质量优化
23.录像播放
24.直播
25.网络
26.归档 & 解档

优点:

单例方式能够保证系统中叁个类独有二个实例并且该实例易于外部访谈,进而方便对实例个数的主宰并节约系统能源。
要是期待在系统中某些类的目的只好存在二个,单例格局是最佳的缓慢解决方案。
单例情势因为类调控了实例化进程,所以类能够越来越灵活改过实例化进程。

缺点:

单例对象后生可畏旦创设,对象指针是保留在静态区的,单例对象在堆中分配的内部存款和储蓄器空间,会在应用程序终止后才会被释放。
单例类无法持续,由此很难打开类的扩展。
单例不适用于变化的靶子,若是意气风发致等级次序的对象总是要在分化的用例场景爆发变化,单例就能够挑起数据的大错特错,无法保留互相的情状。

单例在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的沙盒。每二个应用程式都是二个音信荒岛,相互是无法举办通讯的,唯独能够经过U奥迪Q5L Scheme。沙盒里面包车型客车文书能够是相片、声音文件、文本、属性列表等。

沙河盒根目录的协会

2348494-e0a5c4bac14d0d27-1.png

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

8、Runloop

Runloop 正是运转循环
作用

它里面便是do-while循环,在此个轮回之中不断地拍卖各样职责

怎么要动用RunLoop,常常意况下大家是没需求去运营线程的RunLoop,除非必要在贰个单身的线程长久的质量评定有些事件

两个API

首先要了然iOS里面有两套API能够访谈和应用RunLoop

地点两套都能够动用,不过要明了CFRunLoopRef是用c语言写的,是开源的,相比较于NSRunLoop越发底层,而NSRunLoop其实是对CFRunLoopRef的三个轻易的包裹。便于使用而已。那样说来,分明CFRunLoopRef的习性要高级中学一年级点。

RunLoop相关类

Core Foundation中有RunLoop的多个类

CFRunLoopModeRef
CFRunLoopMode的主要成效是 钦赐事件在职分中的优先级

苹果公开提供了七个mode

CFRunLoopSourseRef

CFRunLoopSourseRef是事件源,分为两种

CFRunLoopObserverRef
CFRunLoopObserver是观望者,能够监听runLoop的情景退换

能够监听的小运点有以下多少个

runloop的定期源和输入源

Runloop管理的输入事件有二种不相同的发源:输入源(input source卡塔尔(قطر‎和定期源(timer source卡塔尔

runloop 和线程的涉嫌

主线程的run loop暗中同意是开发银行的。 UIApplicationMain(卡塔尔(قطر‎函数,这些方法会为mainthread设置多个NSRunLoop对象, 那就表明了:为啥大家的利用能够在无人操作的时候安歇,需求让它干活的时候又能立刻响应

参考:深深了然RunLoop
IOS---实例化疏解RunLoop

9、深浅拷贝

浅复制(copy卡塔尔(قطر‎:只复制指向对象的指针,而不复制援引对象自己
深复制(mutableCopy卡塔尔(英语:State of Qatar):复制引用对象自己。深复制就好明白了,内部存款和储蓄器中设有了两份独立对象自笔者, 当改进A时,A_copy不变

295346-bd95431918be69b1.png

问题
主题材料1:向叁个接续NSObject的目的直接copy会产生如何

答:会崩溃
崩溃消息

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

自定义的类无法平素利用copy、mutableCopy须求重写copyWithZone:和mutableWithZone:方法来变成实际的复制专门的学业,不然会报错:

解决:

问题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发送事件会产生哪些

11、MVC&MVVM

MVC

MVC全称是Model View Controller ,是意气风发种模型 (model卡塔尔国-视图 (view卡塔尔(英语:State of Qatar)-调整器 (controller卡塔尔的缩写。MVC是主流的客商端的编制程序框架,可是用于大气的事体逻辑都汇集在contriller中,往往会引致我们的Controller 过于 肥胖,其实这些主题素材咱们得以凭仗分类 或然有些不是依靠congroller的点子摘出来等办法缓和那个难题

MVVM

MVVM 是 Model-View-ViewModel 的简写。绝对于MVC,MVVM是三个相比新的框构造造,那个2006年微软提议的大器晚成种架考虑路

model层,API乞请的本来数据
view层,视图突显,由viewController来调整
viewModel层,担当作业管理和数目转载

MVVM在动用个中经常会采纳双向绑定手艺,使Model变化时ViewModel会自动更新,而 ViewModel 变化时,View 也会活动生成

缺点

RAC

RACSignal

RACSubscriber

RACDisposable

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

原理

JavaScriptCore常用的类

OC调用JS
精气神:JS代码中曾经定义好变量和艺术,通过OC去获得,并且调用
步骤

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

JS调用OC方法
风度翩翩开端JS中并从未OC的block,所以不得已直接调用OC的block,供给把OC的block,在JS中生成方法,然后在经过JS调用。
步骤

 // 创建JS运行环境
    JSContext *ctx = [[JSContext alloc] init];
// 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方法

WKUserContentController *userCC = config.userContentController;
//JS调用OC 添加处理脚本
[userCC addScriptMessageHandler:self name:@"showMobile"];
- (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。U奥德赛L全称是财富描述符,大家能够那样以为:三个ULANDL地址,它用来描述一个网络上的财富,而HTTP中的GET,POST,PUT,DELETE就对应着对那几个财富的查,改,增,删4个操作。

区别

14、栈&堆

内部存储器分区情形

代码区:寄存函数二进制代码
数据区:系统运维时提请内部存款和储蓄器并带头化,系统退出时由系统释放,存放全局变量、静态变量、常量
堆区:通过malloc等函数或new等操作符动态申请拿到,需技士手动申请和刑释
栈区:函数模块内提请,函数结束时由系统自动释放,贮存局地变量、函数参数

15、property属性的修饰符的效应

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

16、多线程

多线程

七十多线程大约有多样

NSThread

NSThread是苹果封装的,面向对象的,能够直接操控线程的目的,不过需求大家手动管理对象的生命周期,我们不平时选择,可是[NSThread currentThread]它能够拿走当前线程类,你就足以领略当前线程的各样质量,用于调节和测量检验拾贰分利于

GCD

GCD是苹果为多核的相互运算提出的建设方案,可以使得的行使CPU内核,可以团结管理对象的生命周期,是C语言写的

GCD有八个主导概念

队列

NSOperation & NSOperationQue

NSOperation 是苹果公司对 GCD 的包装,完周全向对象,NSOperation 和 NSOperationQueue 分别对应 GCD 的 职责 和 队列

NSOperation 只是叁个抽象类,所以不能够封装职务,但它有 2 个子类用于封装任务。分别是:NSInvocationOperation 和 NSBlockOperation 。成立七个 Operation 后,须求调用 start 方法来运维职分,它会 暗中同意在当前队列同步施行。当然你也得以在中途撤废叁个任务,只须求调用其 cancel 方法就能够

问题
干什么本身的项目中时时使用GCD,然而大拿们开源的第三方平常会选拔NSOperation

缘何大家接受GCD,因为简单,呵呵哒

座谈线程安全题材的两种缓和方案

解决方案: 使用锁: 锁是线程编程同步工具的根基。锁能够令你超轻松保证代码中一大块区域以便你可以确认保障代码的对的。

如何促成线程同步

线程同步: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、线程同步,线程死锁大家在地点介绍过了,这里根本介绍线程同步

保障线程同步的不二诀要

必发365电子游戏指定一个被观察的对象的属性,3.2、代理的实现。主意有许多,这里就轻松说一前一周围的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为该锁的并世无双标记,唯有当标志雷同有时候,才为满意互斥,假诺线程第22中学的@synchronized(obj卡塔尔国改为@synchronized(self卡塔尔,刚线程2就不会被拥塞,@synchronized指令完结锁的亮点便是我们无需在代码中显式的创始锁对象,便可以完毕锁的编制

dispatch_semaphore信号量

dispatch_semaphore非信号量,首纵然调节GCD的并发数,里面有多少个关键的定义

dispatch_semaphore_t signal = dispatch_semaphore_create(1);
dispatch_semaphore_signal(signal);
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 学习(五)

接踵而来更新中...