iOS最常见最基础知识点

一、method与selector的区别:

method是程序创建的一个可执行方;

selector是函数引用,相当于指针。


二、MRC单例编写:

可以同步块实现,也可以GCD实现,但是GCD要更好,保证了线程安全,还省了代码。GCD不用考虑加锁和重量级的同步,底层都给处理好了,使用起来更高效,采用了原子访问查询标记是否执行过,有且只有一次创建;

代码如下:

+ (id)shareInstance {
    static NetworkSingleton *single = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        single = [[self alloc] init];
    });
    return single;
}

ps: static保值作用,保证只初始化一次。


三、TCP/IP、UDP、HTTP、Socket的简要理解:
首先从网络七层结构分布来看:


网络层次结构图.png

1、TCP/IP协议是传输层协议,主要解决数据如何在网络层传输,从字面上看是TCP和IP的合称,实际上是指因特网整个TCP/IP协议族;HTTP协议是应用层协议,主要解决如何包装数据。
关于TCP/IP协议与HTTP协议关系为:传输数据时如果只有传输层无应用层,数据内容就无法识别,没有意义。
2、TCP与UDP的区别:同是传输层协议,但TCP面向连接,TCP三次握手在最低限度上(也是最大程度上)保证了连接的可靠性,而UDP无连接。形象上可以理解为:TCP像打电话(一再确认、三次握手才会发送数据,安全、低效),UDP像发信息(不管在不在数据都会发送出去,实时、高效、不安全)。
3、TCP三次握手的理解:第一次->客户端发送syn包到服务器,进入SYN_SEND状态等待服务器确认;第二次->服务器接收syn包,必须确认客户的SYN同时自己也发送一个syn+ack包,服务器进入SYN_RECV状态;第三次->客户端接收服务器的syn+ack包,向服务器发送确认包ACK,发送完毕客户端和服务器进入ESTABLISHED状态,完成三次握手。
4、HTTP协议即超文本传送协议,建立在TCP协议之上的一种应用,最显著的特点是客户端发送的每次请求都需要服务器回送响应,在请求结束后会主动释放连接,从建立连接到关闭连接的过程称为“一次连接”。
5、Socket是应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用已实现进程在网络中通信。是一种“打开-读/写-关闭”模式的实现,服务器和客户端各自维护一个“文件”,在建立连接打开后,可以向自己文件写入内容供对方读取或者读取对方的内容,通讯结束时关闭文件。以使用TCP协议通讯的socket为例,流程大概是这样:


socket通讯流程.png

四、block实现原理:
block是OC的一个新特性,swift里是没有的,但其实是一个闭包,比如GCD里就大量使用了block,一个引用自动变量的函数。block实际上是指向结构体的指针,编译器会将block的内部代码生成对应的函数。创建block的时候,内部是创建了对应的函数,调用block的时候是调用了之前封装的函数。
实现场景eg:
A类 push到 B类可以通过属性传值,但pop回去的时候不可以,这时可用block传值。首先在B类头文件中定义block:(是否带参数根据需求所定)

@interface ClassNameVC : UIViewController
@property (nonatomic, copy) void(^myBlock)(id obj);
@end

在B类的.m文件中拿到数据方法内(跳转回去之前),调用block将数据传过去:

self. myBlock(@"B传回A的数据");

在A类需要使用数据的方法中调用其block属性声明,保存block代码段实现特定功能:

ClassNameVC *vc = [[ClassNameVC alloc] init];
//声明block
vc.editUserNameBlock = ^(id obj) {
    NSString *receStr = (NSString *)obj;
    yourNeedStr = receStr;
};

五、通知的优劣势:
首先理解一下概念:通知是一个单例对象,允许当事件发生时通知一些对象,允许我们在低耦合下满足控制器与一个任意对象进行通信目的,这种模式基本特征是为了让其他对象能够接收在该控制器中发生某件事情而产生的消息,控制器中用一个notificationName,对控制器来说是匿名的,其他的控制器中使用同样的notificationName来注册该特征的对象(观察者)能对通知的事件作出反应。
优势:
1、不需要大量代码,实现比较简单;
2、对于一个发出的通知,多个对象能够做出反应,即一对多的方式实现简单;
3、controller能够传递对象,对象携带了关于发送通知的自定义的消息;
劣势:
1、在编译期不会检查通知是否能够被观察者正确的处理;
2、在释放注册的对象时,需要在通知中心取消注册;
3、在调试时应用的工作以及控制过程难跟踪;
4、需要第三方对象来管理控制器与观察者对象之间的联系;
5、controller和观察者需要提前知道通知名称,UserInfo dictionary keys。如果这些没有在工作区间定义,那么会出现不同步的情况;

ps:我们平时开发中使用通信除了通知NSNotication center还有两个常用的方式:委托delegate、键值观察key value observing,KVO。

delegate优点:
1、严格的语法、所有将接收的事件必须是在delegate协议中有清晰的定义;
2、如果delegate中的一个方法没有实现就会出现编译警告/错误;
3、协议必须在controller的作用域范围内定义;
4、在一个应用中的控制流程是可跟踪的并且是可识别的;
5、在一个控制器中可以定义多个不同的协议,每个协议有不同的delegate;
6、没有第三方对象要求保持/监视通信过程;
7、能够接收调用的协议方法返回值,意味着delegate能提供反馈信息给controller。
缺点:
1、需要定义很多代码:
(1)定义协议;(2)controller的delegate属性;(3)在delegate本身中实现delegate方法定义;
2、在一个controller中有多个delegate对象,并且delegate是遵守同一个协议,但是还很难告诉多个对象同个事件。

KVO:
是一个对象能够观察另外一个对象的属性的值,并且能够发现值的变化。前面两种模式更加适合一个controller与任何其他对象进行通信,而KVO更适合任何类型的对象侦听另外一个任意对象的改变(也可以是controller,但一般不是controller)。这是一个对象与另外一个对象保持同步的一种方法,即当另外一种对象的状态发生改变时,观察对象立马作出反应。只能用来对属性作出反应,而不会对方法或者动作作出反应。
优点:
1、能提供一种简单的方法实现两个对象间的同步,如model和view的同步;
2、能够对非我们创建的对象,即内部对象的状态改变作出响应,而且不需要改变内部对象(SDK对象)的实现‘
3、能够提供观察的属性的最新值以及先前值;
4、用key paths来观察属性,因此也可以观察嵌套对象;
5、完成对观察对象的抽象,因为不需要额外的代码来允许观察值能被观察。
缺点:
1、我们观察的属性必须用strings来定义,因此编译时不会出现警告检查;
2、对属性重构将导致我们的观察代码不再可用;
3、复杂的if语句要求对象正在观察多个值,因为所有的观察代码通过一个方法来指向;
4、当释放观察者时不需移除观察者。

六、多线程:
一个进程中开启多条线程,多条线程可并发(同时)执行不同的任务。
原理:同一时间,CPU只能处理一条线程,只有一条线程在执行;多线程并发执行其实是CPU快速在多条线程之间调度切换,多核CPU是真正意义上的多线程。

优点:
能适当提高程序的执行效率;
缺点:
(1)创建线程是有开销的,iOS下主要包括:内核数据结构(约1KB)、栈空间(子线程512KB、主线程1MB);
(2)开启大量线程会降低程序性能;
(3)线程越多CPU调度线程上的开销越大;
(4)程序设计更加复杂,如线程之间通信、多线程数据共享。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容

  • __block和__weak修饰符的区别其实是挺明显的:1.__block不管是ARC还是MRC模式下都可以使用,...
    LZM轮回阅读 3,282评论 0 6
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,182评论 11 349
  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 27,121评论 29 470
  • http://www.devstore.cn/essay/essayInfo/6525.html【原文地址】 序言...
    起名好难_fz阅读 633评论 1 1
  • 转自 iOS 面试常见问题最全梳理 序言 目前形势,参加到iOS队伍的人是越来越多,甚至已经到供过于求了。今年,找...
    ZMJun阅读 788评论 0 11