IOS开发知识点整理

1、设计模式是什么? 你知道哪些设计模式,并简要叙述?

设计模式是一种编码经验,就是用比较成熟的逻辑去处理某一种类型的事情。

1). 单例模式:通过static关键词,声明全局变量。在整个进程运行期间只会被赋值一次。

2). 观察者模式:KVO是典型的通知模式,观察某个属性的状态,状态发生变化时通知观察者。

3). 委托模式:代理+协议的组合。实现1对1的反向传值操作。

4). 工厂模式:通过一个类方法,批量的根据已有模板生产对象。

什么是单例模式

简单的来说,一个单例类,在整个程序中只有一个实例,并且提供一个类方法供全局调用,在编译时初始化这个类,然后一直保存在内存中,到程序(APP)退出时由系统自动释放这部分内存。

系统为我们提供的单例类有哪些?

UIApplication(应用程序实例类)NSNotificationCenter(消息中心类)NSFileManager(文件管理类)NSUserDefaults(应用程序设置)NSURLCache(请求缓存类)NSHTTPCookieStorage(应用程序cookies池)

在哪些地方会用到单例模式

一般在我的程序中,经常调用的类,如工具类、公共跳转类等,我都会采用单例模式

单例类的生命周期(单例实例在存储器的中位置)

在程序中,一个单例类在程序中只能初始化一次,为了保证在使用中始终都是存在的,所以单例是在存储器的全局区域,在编译时分配内存,只要程序还在运行就会一直占用内存,在APP结束后由系统释放这部分内存内存。

单例模式的优缺点

(1)、在整个程序中只会实例化一次,所以在程序如果出了问题,可以快速的定位问题所在;

(2)、由于在整个程序中只存在一个对象,节省了系统内存资源,提高了程序的运行效率;


(1)、不能被继承,不能有子类;

(2)、不易被重写或扩展(可以使用分类);

(3)、同时,由于单例对象只要程序在运行中就会一直占用系统内存,该对象在闲置时并不能销毁,在闲置时也消耗了系统内存资源;

代理主要由三部分组成

协议:用来指定代理双方可以做什么,必须做什么。

代理:根据协议,完成委托方需要实现的功能(方法)。

委托:根据协议,指定代理去完成什么功能。


2、MVC 和 MVVM 的区别

1). MVVM是对胖模型进行的拆分,其本质是给控制器减负,将一些弱业务逻辑放到VM中去处理。

2). MVC是一切设计的基础,所有新的设计模式都是基于MVC进行的改进。

1). MVC模式:Model View Control,把模型 视图 控制器 层进行解耦合编写。

2). MVVM模式:Model View ViewModel 把模型 视图 业务逻辑 层进行解耦和编写。

3、ViewController生命周期

1.initWithCoder:通过nib文件初始化时触发。2.awakeFromNib:nib文件被加载的时候,会发生一个awakeFromNib的消息到nib文件中的每个对象。3.loadView:开始加载视图控制器自带的view。4.viewDidLoad:视图控制器的view被加载完成。5.viewWillAppear:视图控制器的view将要显示在window上。6.updateViewConstraints:视图控制器的view开始更新AutoLayout约束。7.viewWillLayoutSubviews:视图控制器的view将要更新内容视图的位置。8.viewDidLayoutSubviews:视图控制器的view已经更新视图的位置。9.viewDidAppear:视图控制器的view已经展示到window上。10.viewWillDisappear:视图控制器的view将要从window上消失。11.viewDidDisappear:视图控制器的view已经从window上消失。

4、你是否接触过OC中的反射机制?简单聊一下概念和使用

1).class反射 通过类名的字符串形式实例化对象。 Classclass=NSClassFromString(@"student"); Student *stu = [[classalloc] init]; 将类名变为字符串。 Classclass=[Studentclass];NSString*className =NSStringFromClass(class);

2). SEL的反射 通过方法的字符串形式实例化方法。 SEL selector =NSSelectorFromString(@"setName"); [stu performSelector:selector withObject:@"Mike"]; 将方法变成字符串。NSStringFromSelector(@selector*(setName:));

5、iOS的沙盒目录结构是怎样的?

沙盒结构:

1). Application:存放程序源文件,上架前经过数字签名,上架后不可修改。

2). Documents:常用目录,iCloud备份目录,存放数据。(这里不能存缓存文件,否则上架不被通过)

3). Library:

        Caches:存放体积大又不需要备份的数据。(常用的缓存路径)

        Preference:设置目录,iCloud会备份设置信息。

4). tmp:存放临时文件,不会被备份,而且这个文件下的数据有可能随时被清除的可能。

6、什么是 RunLoop

从字面上讲就是运行循环,它内部就是do-while循环,在这个循环内部不断地处理各种任务。一个线程对应一个RunLoop,基本作用就是保持程序的持续运行,处理app中的各种事件。通过runloop,有事运行,没事就休息,可以节省cpu资源,提高程序性能。主线程的run loop默认是启动的。iOS的应用程序里面,程序启动后会有一个如下的main()函数intmain(intargc,char* argv[]) {@autoreleasepool{returnUIApplicationMain(argc, argv,nil,NSStringFromClass([AppDelegateclass])); }}

7、HTTP协议中 POST 方法和 GET 方法有那些区别?

1. GET用于向服务器请求数据,POST用于提交数据

2. GET请求,请求参数拼接形式暴露在地址栏,而POST请求参数则放在请求体里面,因此GET请求不适合用于验证密码等操作

3. GET请求的URL有长度限制,POST请求不会有长度限制

8、谈谈 UITableView 的优化

1). 正确的复用cell。

2). 设计统一规格的Cell

3). 提前计算并缓存好高度(布局),因为heightForRowAtIndexPath:是调用最频繁的方法;

4). 异步绘制,遇到复杂界面,遇到性能瓶颈时,可能就是突破口;

4). 滑动时按需加载,这个在大量图片展示,网络加载的时候很管用!

5). 减少子视图的层级关系

6). 尽量使所有的视图不透明化以及做切圆操作。

7). 不要动态的add 或者 remove 子控件。最好在初始化时就添加完,然后通过hidden来控制是否显示。

8). 使用调试工具分析问题。

9、Swift和OC的区别

1.不像C语言和OC语言一样都必须有一个主函数main()作为程序的入口, swift程序从第一句开始向下顺序执行, 一直到最后

2.每个语句结束后可以不加分号, 但是多条语句不能写在同一行

3.在声明常亮后者变量的时候直接初始化可以省略其类型,  否则需要在变量名称跟冒号加类型. 实际开发中建议全部都加上, 以免出现问题

4.swift数据类型都会自动判断, 只区分变量var 和 常量let

5.swift可以多对多赋值. let(x,y) = (1,2)

6.swift和OC比较具有全局性, 因为swift是全局的所以编译的速度比OC慢

10、iOS自定义控件开发方式

使用代码创建自定义控件

1.创建一个继承自UIView的类

2.实现initWithFrame:方法。在该方法中,设置自定义控件的属性,并创建、添加子视图:

3.如果需要对子视图重新布局,需要调用layoutSubViews方法

4.最后,添加自定义控件到页面上

小结

这两种创建自定义控件的方式各有优劣,纯代码方式比较灵活,维护和扩展都比较方便,但写起来比较麻烦。xib方式开发效率高,但不易扩展和维护,适合功能样式比较稳定的自定义控件。

11、iOS事件分发机制介绍与应用

iOS事件分发流程1.hitTest 2.sendEvent 3.事件处理

事件响应链

UIResponder类能够响应触摸、手势以及远程控制等事件。它是所有可响应事件的基类,其中包括很常见的UIView、UIViewController以及UIApplication。那么事件响应链与UIResponder有什么关系呢?应用内的视图按一定的结构组织起来,即树状层次结构,一个视图可以有多个子视图,而子视图只能有一个父视图。当一个视图被添加到父视图上时。每一个视图的nextResponder属性就指向它的父视图,这样,整个应用就通过nextResponder串成了一条链,即响应链。响应链是一个虚拟链,并不是真实存在的,它借助UIResponder的nextResponder串连起来

Hit-Test View

有了事件响应链,接下来就是寻找具体响应对象了,我们称之为:Hit-Testing View,寻找这个View的过程称为Hit-Test。

什么是Hit-Test?我们可以把它理解为一个探测器,通过这个探测器,我们可以找到并判断手指是否触摸在某个视图上。

Hit-Test是如何工作的?Hit-Test采用递归方式从视图的根节点开始遍历,直到找到某个点击的视图。

首先从UIWindow发送hitTest:withEvent:消息开始,判断该视图是否能响应触摸事件,如果不能响应返回nil,表示该视图不能响应触摸事件。然后再调用pointInside:withEvent:方法,该方法用于判断触摸事件点击的位置是否处理该视图范围内,如果pointInside:withEvent:返回no,那么hitTest:withEvent:也直接返回nil。

如果pointInside:withEvent: 方法返回yes,那么该视图向所有子视图发送hitTest:withEvent:消息,所有子视图的调用顺序是从最顶层视图一直到最底层视图,即从subViews的数组的末尾向前遍历。直到有子视图返回非空对象或全部遍历完毕。若有子视图返回非空对象,则hitTest:withEvent:方法返回该对象,处理结束;若所有子视图都返回nil,则hitTest:withEvent:方法返回该视图自身。

事件传递机制的应用

举几个例子,说明一下事件传递机制在自定义控件中的应用。

12、iOS本地数据保存常用方式

NSUserDefaults

归档(序列化)

文件

数据库

CoreData

KeyChain

13、谈谈你对多线程开发的理解?ios中有几种实现多线程的方法?

好处:

1.使用多线程可以把程序中占据时间长的任务放到后台去处理,如图片,视频的下载;

2.发挥多核处理器的优势,并发执行让系统运行的更快,更流畅,用户体验更好;

缺点:

1.大量的线程降低代码的可读性;

2.更多的线程需要更多的内存空间;

3当多个线程对同一个资源出现争夺的时候要注意线程安全的问题。

ios有3种多线程编程的技术:1.NSThread,2.NSOperationQueue,3.gcd;

NSThread.

每个NSThread对象对应一个线程,量级较轻(真正的多线程)

NSThree是官方推荐的线程处理方式,它在处理机制上,需要开发者负责手动管理Thread的生命周期,包括子线程与主线程之间的同步等。线程共享同一应用程序的部分内存空间,它们拥有对数据相同的访问权限。你得协调多个线程 对同一数据的访问,一般做法是在访问之前加锁,这会导致一定的性能开销。在 iOS 中我们可以使用多种形式的 thread。 比其他两个轻量级 需要自己管理线程的生命周期,线程同步。 线程同步对数据的加锁会有一定的系统开销.

NSOperation/NSOperationQueue 面向对象的线程技术

如果需要让线程同时并行运行多个,可以将线程加入队列(Queue)中,NSOperationQueue类就是一个线程队列管理类,他提供了线程并行、队列的管理。可以认为NSOperationQueue就是一个线程管理器,通过addOperations方法,我们可以一次性把多个(数组形式)线程添加到队列中。同时,NSOperationQueue允许通过setMaxConcurrentOperationCount方法设置队列的并行(同一时间)运行数量

Grand Central Dispatch(GCD)是Apple开发的一个多核编程的解决方法。该方法在Mac OS X 10.6雪豹中首次推出,并随后被引入到了iOS4.0中。GCD是一个替代诸如NSThread, NSOperationQueue, NSInvocationOperation等技术的很高效和强大的技术,它看起来象就其它语言的闭包(Closure)一样,但苹果把它叫做blocks。

GCD —— Grand Central Dispatch(大调度中心) 是基于C语言的框架,可以充分利用多核,是苹果推荐使用的多线程技术

以上这三种编程方式从上到下,抽象度层次是从低到高的,抽象度越高的使用越简单,也是Apple最推荐使用的,在项目中很多框架技术分别使用了不同多线程技术。

三种多线程技术的对比

NSThread:

优点:NSThread 比其他两个轻量级,使用简单

缺点:需要自己管理线程的生命周期、线程同步、加锁、睡眠以及唤醒等。线程同步对数据的加锁会有一定的系统开销

NSOperation:不需要关心线程管理,数据同步的事情,可以把精力放在自己需要执行的操作上–NSOperation是面向对象的

优点: 提供了一些在GCD中不容易实现的特性,如:限制最大并发数量,操作之间的依赖关系.

GCD:NSOperation的高效和强大的技术–GCD是基于C语言的

优点1:用Block定义任务,使用起来非常灵活便捷;(要注意:也可能出现循环引用)

优点2:提供了更多的控制能力以及操作队列中所不能使用的底层函数.


14、iOS App上架流程

15、代理丶通知丶KVO之间是怎么在控制器之间通信的,或者说是怎么传值的,又或者说之间的区别

1.委托 delegation;

2.通知中心  Notification Center;

3.键值观察  key value observing(KVO)

16、iOS-APP瘦身

17、APP内测方式

第三方框架

1、AFNetworking 底层原理分析

AFNetworking主要是对NSURLSession和NSURLConnection(iOS9.0废弃)的封装,其中主要有以下类:1). AFHTTPRequestOperationManager:内部封装的是NSURLConnection, 负责发送网络请求, 使用最多的一个类。(3.0废弃)2). AFHTTPSessionManager:内部封装是NSURLSession, 负责发送网络请求,使用最多的一个类。3). AFNetworkReachabilityManager:实时监测网络状态的工具类。当前的网络环境发生改变之后,这个工具类就可以检测到。4). AFSecurityPolicy:网络安全的工具类, 主要是针对 HTTPS 服务。5). AFURLRequestSerialization:序列化工具类,基类。上传的数据转换成JSON格式 (AFJSONRequestSerializer).使用不多。6). AFURLResponseSerialization:反序列化工具类;基类.使用比较多:7). AFJSONResponseSerializer; JSON解析器,默认的解析器.8). AFHTTPResponseSerializer; 万能解析器; JSON和XML之外的数据类型,直接返回二进制数据.对服务器返回的数据不做任何处理.9). AFXMLParserResponseSerializer; XML解析器;

2、描述下SDWebImage里面给UIImageView加载图片的逻辑

加载图片的过程大致如下:1.首先会在 SDWebImageCache 中寻找图片是否有对应的缓存, 它会以url 作为数据的索引先在内存中寻找是否有对应的缓存  2.如果缓存未找到就会利用通过MD5处理过的key来继续在磁盘中查询对应的数据, 如果找到了, 就会把磁盘中的数据加载到内存中,并将图片显示出来   3.如果在内存和磁盘缓存中都没有找到,就会向远程服务器发送请求,开始下载图片  4.下载后的图片会加入缓存中,并写入磁盘中5.整个获取图片的过程都是在子线程中执行,获取到图片后回到主线程将图片显示出来 

 SDWebImage原理:调用类别的方法:1.从内存(字典)中找图片(当这个图片在本次使用程序的过程中已经被加载过),找到直接使用。2.从沙盒中找(当这个图片在之前使用程序的过程中被加载过),找到使用,缓存到内存中。3.从网络上获取,使用,缓存到内存,缓存到沙盒。

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