共计 27554 个字符,预计需要花费 69 分钟才能阅读完成。
本文收录:简书【超全!iOS 面试题汇总(清晰易懂)】
1. Object- c 的类能够多重继承么? 能够实现多个接口么? 重写一个类的形式用继承好还是分类好? 为什么?
Object-c:
- 不可多重继承
- 可实现多个接口
Category 类别:
- 个别状况用分类好
为什么分类好?:
- 用 Category 去重写类的办法,仅对本 Category 无效,不会影响其余类与原有类的关系。
2. #import 跟 #include 又什么区别,@class 呢, #import 跟 #import””又什么区别?
#import:
- Objective- C 导入头文件的关键字
#include:
- C/C++ 导入头文件的关键字
#import 跟 #include 区别:
- 应用 #import 头文件会主动只导入一次,不会反复导入,相当于#include 和#pragma once;
@class:
- 编译器某个类的申明,当执行时,才去查看类的实现文件,能够解决头文件的互相蕴含;
#import 跟 #import””区别:
#import:
- 蕴含零碎的头文件
#import””:
- 蕴含用户头文件
3. 属性 readwrite,readonly,assign,retain,copy,nonatomic 各是什么作用,在那种状况下用?
readwrite:
- 可读可写个性(须要生成 getter 办法和 setter 办法时)
readonly:
- 只读个性(只会生成 getter 办法 不会生成 setter 办法 ; 不心愿属性在类外扭转)
assign:
- 是赋值个性(setter 办法将传入参数赋值给实例变量; 仅设置变量时)
retain:
- 持有个性(setter 办法将传入参数先保留,再赋值,传入参数的 retaincount 会 +1)
copy:
- 赋值个性(setter 办法将传入对象复制一份; 须要齐全一份新的变量时)
nonatomic:
- 非原子操作(决定编译器生成的 setter getter 是否是原子操作,atomic 示意多线程平安,个别应用 nonatomic)
4. 写一个 setter 办法用于实现 @property (nonatomic,retain)NSString name, 写一个 setter 办法用于实现 @property(nonatomic,copy)NSString name
-?(void)?setName:(NSString*)?str
{[str?retain];
[name?release];
name?=?str;
}
-?(void)setName:(NSString?*)str
{id?t?=?[str?copy];
[name?release];
name?=?t;
}
5. 对于语句 NSString*obj = [[NSData alloc] init]; obj 在编译时和运行时别离时什么类型的对象?
编译时:
- NSString 的类型
运行时:
- NSData 类型的对象
常见的 object- c 的数据类型有那些,和 C 的根本数据类型有什么区别? 如:NSInteger 和 int
object- c 常见数据类型:
- NSString
- NSNumber
- NSArray
- NSMutableArray
- NSData
…C 语言的根本数据类型:
- int(肯定字节的内存空间,用于寄存数值)
NSInteger 根本数据类型:
- 不是 NSNumber 的子类
- 不是 NSObject 的子类
- 是 Int 或者 Long 的别名(NSInteger 的定义 typedef long NSInteger)
区别:
- NSInteger 会依据零碎是 32 位还是 64 位来决定是自身是 int 还是 Long
7.id 申明的对象有什么个性?
Id 申明的对象个性:
- 运行时(能够指向任意类型的 objcetive- c 的对象)
8.Objective- C 如何对内存治理的, 说说你的认识和解决办法?
Objective- C 的内存治理次要有三种形式:
ARC(主动内存计数)
- (Garbage Collection)主动内存计数:
- 这种形式和 java 相似,在你的程序的执行过程中。始终有一个高人在背地精确地帮你拾掇垃圾,你不必思考它什么时候开始工作,怎么工作。你只须要明确,我申请了一段内存空间,当我不再应用从而这段内存成为垃圾的时候,我就彻底的把它忘记掉,反正那个高人会帮我拾掇垃圾。遗憾的是,那个高人须要耗费肯定的资源,在携带设施外面,资源是紧俏商品所以 iPhone 不反对这个性能。所以“Garbage Collection”不是本入门指南的范畴,对“Garbage Collection”外部机制感兴趣的同学能够参考一些其余的材料,不过说老实话“Garbage Collection”不大适宜适初学者钻研。
计划:
- 通过 alloc – initial 形式创立的, 创立后援用计数 +1, 尔后每 retain 一次援用计数 +1, 那么在程序中做相应次数的 release 就好了.
手动内存计数
- (Reference Counted)手动内存计数:
- 就是说,从一段内存被申请之后,就存在一个变量用于保留这段内存被应用的次数,咱们临时把它称为计数器,当计数器变为 0 的时候,那么就是开释这段内存的时候。比如说,当在程序 A 外面一段内存被胜利申请实现之后,那么这个计数器就从 0 变成 1(咱们把这个过程叫做 alloc),而后程序 B 也须要应用这个内存,那么计数器就从 1 变成了 2(咱们把这个过程叫做 retain)。紧接着程序 A 不再须要这段内存了,那么程序 A 就把这个计数器减 1(咱们把这个过程叫做 release); 程序 B 也不再须要这段内存的时候,那么也把计数器减 1(这个过程还是 release)。当零碎 (也就是 Foundation) 发现这个计数器变 成员了 0,那么就会调用内存回收程序把这段内存回收(咱们把这个过程叫做 dealloc)。顺便提一句,如果没有 Foundation,那么保护计数器,开释内存等等工作须要你手工来实现。
计划:
- 个别是由类的静态方法创立的, 函数名中不会呈现 alloc 或 init 字样, 如 [NSString string] 和[NSArray arrayWithObject:], 创立后援用计数 +0, 在函数出栈后开释, 即相当于一个栈上的局部变量. 当然也能够通过 retain 缩短对象的生存期.
内存池
- (NSAutoRealeasePool)内存池:
- 能够通过创立和开释内存池管制内存申请和回收的机会.
计划:
- 是由 autorelease 退出零碎内存池, 内存池是能够嵌套的, 每个内存池都须要有一个创立开释对, 就像 main 函数中写的一样. 应用也很简略, 比方[[[NSString alloc]initialWithFormat:@”Hey you!”] autorelease], 行将一个 NSString 对象退出到最内层的零碎内存池, 当咱们开释这个内存池时, 其中的对象都会被开释.
9. 原子 (atomic) 跟非原子 (non-atomic) 属性有什么区别?
atomic:
- 提供多线程平安(避免在写未实现的时候被另外一个线程读取,造成数据谬误)
non-atomic:
- 在本人治理内存的环境中,解析的拜访器保留并主动开释返回的值,如果指定了 nonatomic,那么拜访器只是简略地返回这个值。
10. 看上面的程序, 第一个 NSLog 会输入什么? 这时 str 的 retainCount 是多少? 第二个和第三个呢? 为什么?
NSMutableArray*?ary?=?[[NSMutableArray?array]?retain];
NSString?*str?=?[NSString?stringWithFormat:@"test"];
[str?retain];
[aryaddObject:str];
NSLog(@”%@%d”,str,[str?retainCount]);
[str?retain];
[str?release];
[str?release];
NSLog(@”%@%d”,str,[str?retainCount]);
[aryremoveAllObjects];
NSLog(@”%@%d”,str,[str?retainCount]);
str 的 retainCount 创立 +1,retain+1,退出数组主动 +1 3
retain+1,release-1,release-1 2
数组删除所有对象,所有数组内的对象主动 -1 1
11. 内存治理的几条准则是什么? 依照默认法令. 那些关键字生成的对象须要手动开释? 在和 property 联合的时候怎么无效的防止内存泄露?
谁申请,谁开释
遵循 Cocoa Touch 的应用准则;
内存治理次要要防止“过早开释”和“内存透露”,对于“过早开释”须要留神 @property 设置个性时,肯定要用对个性关键字,对于“内存透露”,肯定要申请了要负责开释,要仔细。
关键字 alloc 或 new 生成的对象须要手动开释;
设置正确的 property 属性,对于 retain 须要在适合的中央开释,
12. 如何对 iOS 设施进行性能测试?
Profile
- Instruments
- Time Profiler
13. Object C 中创立线程的办法是什么? 如果在主线程中执行代码,办法是什么? 如果想延时执行代码、办法又是什么?
线程创立有三种办法:
- 应用 NSThread 创立、应用 GCD 的 dispatch、应用子类化的 NSOperation, 而后将其退出 NSOperationQueue; 在主线程执行代码,办法是 performSelectorOnMainThread,如果想延时执行代码能够用 performSelector:onThread:withObject:waitUntilDone:
14. MVC 设计模式是什么?你还相熟什么设计模式?
设计模式:
- 并不是一种新技术,而是一种编码教训,应用比方 java 中的接口,iphone 中的协定,继承关系等根本伎俩,用比拟成熟的逻辑去解决某一种类型的事件,总结为所谓设计模式。面向对象编程中,java 曾经演绎了 23 种设计模式。
mvc 设计模式:
- 模型,视图,控制器,能够将整个应用程序在思想上分成三大块,对应是的数据的存储或解决,前台的显示,业务逻辑的管制。Iphone 自身的设计思维就是遵循 mvc 设计模式。其不属于 23 种设计模式领域。
代理模式:
- 代理模式给某一个对象提供一个代理对象,并由代理对象管制对源对象的援用. 比方一个工厂生产了产品,并不想间接卖给用户,而是搞了很多代理商,用户能够间接找代理商买货色,代理商从工厂进货. 常见的如 QQ 的主动回复就属于代理拦挡,代理模式在 iphone 中失去广泛应用.
单例模式:
- 说白了就是一个类不通过 alloc 形式创建对象,而是用一个静态方法返回这个类的对象。零碎只须要领有一个的全局对象,这样有利于咱们协调系统整体的行为,比方想取得[UIApplication sharedApplication]; 任何中央调用都能够失去 UIApplication 的对象,这个对象是全局惟一的。
观察者模式:
- 当一个物体发生变化时,会告诉所有察看这个物体的观察者让其做出反馈。实现起来无非就是把所有观察者的对象给这个物体,当这个物体的产生扭转,就会调用遍历所有观察者的对象调用观察者的办法从而达到告诉观察者的目标。
工厂模式:
public?class?Factory{public?static?Sample?creator(int?which){if?(which==1) return?new?SampleA(); else?if?(which==2) return?new?SampleB();} }
15 浅复制和深复制的区别?
浅层复制:
- 只复制指向对象的指针,而不复制援用对象自身。
深层复制:
- 复制援用对象自身。
意思就是说我有个 A 对象,复制一份后失去 A_copy 对象后,对于浅复制来说,A 和 A_copy 指向的是同一个内存资源,复制的只不过是是一个指针,对象自身资源
还是只有一份,那如果咱们对 A_copy 执行了批改操作, 那么发现 A 援用的对象同样被批改,这其实违反了咱们复制拷贝的一个思维。深复制就好了解了, 内存中存在了
两份独立对象自身。
16. 类别的作用? 继承和类别在实现中有何区别?
category 能够在不获悉,不扭转原来代码的状况下往里面增加新的办法,只能增加,不能删除批改,并且如果类别和原来类中的办法产生名称抵触,则类别将笼罩原来的办法,因为类别具备更高的优先级。
类别次要有 3 个作用:
1). 将类的实现扩散到多个不同文件或多个不同框架中。
2). 创立对公有办法的前向援用。
3). 向对象增加非正式协定。
继承能够减少,批改或者删除办法,并且能够减少属性。
17. 类别和类扩大的区别。
category 和 extensions 的不同在于 后者能够增加属性。
另外后者增加的办法是必须要实现的。
extensions 能够认为是一个公有的 Category。
18. oc 中的协定和 java 中的接口概念有何不同?
OC 中的代理有 2 层含意,官网定义为 formal 和 informal protocol。前者和 Java 接口一样。
informal protocol 中的办法属于设计模式思考领域,不是必须实现的,然而如果有实现,就会扭转类的属性。
其实对于正式协定,类别和非正式协定我很早前学习的时候大抵看过,也写在了学习教程里
“非正式协定概念其实就是类别的另一种表达方式“这里有一些你可能心愿实现的办法,你能够应用他们更好的实现工作”。
这个意思是,这些是可选的。比方我门要一个更好的办法,咱们就会申明一个这样的类别去实现。而后你在前期能够间接应用这些更好的办法。
这么看,总感觉类别这玩意儿有点像协定的可选协定。”
当初来看,其实 protocal 曾经开始对两者都对立和标准起来操作,因为材料中说“非正式协定应用 interface 润饰“,
当初咱们看到协定中两个修饰词:“必须实现(@requied)”和“可选实现(@optional)”。
19. 什么是 KVO 和 KVC?
KVC: 键 – 值编码是一种间接拜访对象的属性应用字符串来标识属性,而不是通过调用存取方法,间接或通过实例变量拜访的机制。
很多状况下能够简化程序代码。apple 文档其实给了一个很好的例子。
KVO:
- 键值察看机制,他提供了察看某一属性变动的办法,极大的简化了代码。
具体用看到嗯哼用到过的一个中央是对于按钮点击变动状态的的监控。
比方我自定义的一个 button
[self?addObserver:self?forKeyPath:@"highlighted"?options:0?context:nil];
#pragma?mark?KVO
-?(void)observeValueForKeyPath:(NSString?*)keyPath?ofObject:(id)object?change:(NSDictionary?*)change?context:(void?*)context
{if?([keyPath?isEqualToString:@"highlighted"]?)?{[self?setNeedsDisplay];
}
}
对于零碎是依据 keypath 去取的到相应的值产生扭转,实践上来说是和 kvc 机制的情理是一样的。
对于 kvc 机制如何通过 key 寻找到 value:
“当通过 KVC 调用对象时,比方:[self valueForKey:@”someKey”]时,程序会主动试图通过几种不同的形式解析这个调用。首先查找对象是否带有 someKey 这个办法,如果没找到,会持续查找对象是否带有 someKey 这个实例变量(iVar),如果还没有找到,程序会持续试图调用 -(id) valueForUndefinedKey: 这个办法。如果这个办法还是没有被实现的话,程序会抛出一个 NSUndefinedKeyException 异样谬误。
(cocoachina.com 注:Key-Value Coding 查找办法的时候,不仅仅会查找 someKey 这个办法,还会查找 getsomeKey 这个办法,后面加一个 get,或者_someKey 以及_getsomeKey 这几种模式。同时,查找实例变量的时候也会不仅仅查找 someKey 这个变量,也会查找_someKey 这个变量是否存在。)
设计 valueForUndefinedKey: 办法的次要目标是当你应用 -(id)valueForKey 办法从对象中申请值时,对象可能在谬误产生前,有最初的机会响应这个申请。这样做有很多益处,上面的两个例子阐明了这样做的益处。“
因为咱们晓得 button 却是存在一个 highlighted 实例变量. 因而为何下面咱们只是 add 一个相干的 keypath 就行了,
能够依照 kvc 查找的逻辑了解,就说的过来了。
20. 代理的作用?
代理的目标是扭转或传递管制链。容许一个类在某些特定时刻告诉到其余类,而不须要获取到那些类的指针。能够缩小框架复杂度。
另外一点,代理能够了解为 java 中的回调监听机制的一种相似。
21. oc 中可批改和不能够批改类型。
可批改不可批改的汇合类。这个我集体简略了解就是可动静增加批改和不可动静增加批改一样。
比方 NSArray 和 NSMutableArray。前者在初始化后的内存控件就是固定不可变的,后者能够增加等,能够动静申请新的内存空间。
22. 咱们说的 oc 是动静运行时语言是什么意思?
多态。次要是将数据类型的确定由编译时,推延到了运行时。
这个问题其实浅波及到两个概念,运行时和多态。
简略来说,运行时机制使咱们直到运行时才去决定一个对象的类别,以及调用该类别对象指定办法。多态:
- 不同对象以本人的形式响应雷同的音讯的能力叫做多态。意思就是假如生物类 (life) 都用有一个雷同的办法 -eat;
都继承了 life 后,实现各自的 eat,然而调用是咱们只需调用各自的 eat 办法。
也就是不同的对象以本人的形式响应了雷同的音讯(响应了 eat 这个选择器)。
因而也能够说,运行时机制是多态的根底?~~~
23. 告诉和协定的不同之处?
协定有管制链 (has-a) 的关系,告诉没有。
简略来说,告诉的话,它能够一对多,一条音讯能够发送给多个音讯接受者。
24. 什么是推送音讯?
推送告诉更是一种技术。
简略点就是客户端获取资源的一种伎俩。
一般状况下,都是客户端被动的 pull。
推送则是服务器端被动 push。测试 push 的实现能够查看该博文。
25. 对于多态性
多态,子类指针能够赋值给父类。
这个题目其实能够出到所有面向对象语言中,
因而对于多态,继承和封装根本最好都有个 自我意识的了解,也并非肯定要把书上材料上写的能背进去
26. 对于单例的了解
在 objective- c 中要实现一个单例类,至多须要做以下四个步骤:
1). 为单例对象实现一个动态实例,并初始化,而后设置成 nil,
2). 实现一个实例构造方法查看下面申明的动态实例是否为 nil,如果是则新建并返回一个本类的实例,
3). 重写 allocWithZone 办法,用来保障其他人间接应用 alloc 和 init 试图取得一个新实力的时候不产生一个新实例,
4). 适当实现 allocWitheZone,copyWithZone,release 和 autorelease。
27. 说说响应链
事件响应链。包含点击事件,画面刷新事件等。在视图栈内从上至下,或者从下之上流传。
能够说点事件的散发,传递以及解决。具体能够去看下 touch 事件这块。因为问的太抽象化了
重大狐疑题目出到越前面就越抽象。
能够从责任链模式,来讲通过事件响应链解决,其领有的扩展性
28. frame 和 bounds 有什么不同?
frame 指的是:
- 该 view 在父 view 坐标零碎中的地位和大小。(参照点是父亲的坐标零碎)
bounds 指的是:
- 该 view 在自身坐标零碎中 的地位和大小。(参照点是自身坐标零碎)
29. 办法和选择器有何不同?
selector 是一个办法的名字,method 是一个组合体,蕴含了名字和实现.
详情能够看 apple 文档。
面试材料获取形式:
收费支付
获取时请备注:BAT 面试材料【附带 2021 年学习方向纲要图】;(PS: 请勿外传,仅限集体学习应用)
30. OC 的垃圾回收机制?
OC2.0 有 Garbage collection,然而 iOS 平台不提供。
个别咱们理解的 objective- c 对于内存治理都是手动操作的,然而也有主动开释池。
然而差了大部分材料,貌似不要和 arc 机制搞混就好了。
31. NSOperation queue?
寄存 NSOperation 的汇合类。
操作和操作队列,根本能够看成 java 中的线程和线程池的概念。用于解决 ios 多线程开发的问题。
网上局部材料提到一点是,尽管是 queue,然而却并不是带有队列的概念,放入的操作并非是依照严格的先进现出。
这边又有个疑点是,对于队列来说,先进先出的概念是 Afunc 增加进队列,Bfunc 紧跟着也进入队列,Afunc 先执行这个是必然的,
然而 Bfunc 是等 Afunc 齐全操作完当前,B 才开始启动并且执行,因而队列的概念离乱上有点违反了多线程解决这个概念。
然而转念一想其实能够参考银行的取票和叫号零碎。
因而对于 A 比 B 先排队取票然而 B 率先执行完操作,咱们亦然能够理性认为这还是一个队列。
然而起初看到一票对于这操作队列话题的文章,其中有一句提到
“因为两个操作提交的工夫距离很近,线程池中的线程,谁先启动是不定的。”
霎时感觉这个 queue 名字有点忽悠人了,还不如 pool~
综合一点,咱们晓得他能够比拟大的用途在于能够帮组多线程编程就好了。
32. 什么是提早加载?
懒汉模式 ,只在用到的时候才去初始化。
也能够了解成延时加载。
我感觉最好也最简略的一个列子就是 tableView 中图片的加载显示了。
一个延时载,防止内存过高,一个异步加载,防止线程梗塞。
33. 是否在一个视图控制器中嵌入两个 tableview 控制器?
一个视图管制只提供了一个 View 视图,实践上一个 tableViewController 也不能放吧,
只能说能够嵌入一个 tableview 视图。当然,题目自身也有歧义,如果不是咱们定性思维认为的 UIViewController,而是宏观的示意视图控制者,那咱们倒是能够把其看成一个视图控制者,它能够管制多个视图控制器,比方 TabbarController 那样的感觉。
34. 一个 tableView 是否能够关联两个不同的数据源? 你会怎么解决?
首先咱们从代码来看,数据源如何关联上的,其实是在数据源关联的代理办法里实现的。
因而咱们并不关怀如何去关联他,他怎么关联上,办法只是让我返回依据本人的须要去设置如相干的数据源。
35. 什么时候应用 NSMutableArray,什么时候应用 NSArray?
当数组在程序运行时,须要一直变动的,应用 NSMutableArray,当数组在初始化后,便不再扭转的,应用 NSArray。须要指出的是,应用 NSArray 只表明的是该数组在运行时不产生扭转,即不能往 NSAarry 的数组里新增和删除元素,但不表明其数组內的元素的内容不能产生扭转。NSArray 是线程平安的,NSMutableArray 不是线程平安的,多线程应用到 NSMutableArray 须要留神。
36. 给出委托办法的实例,并且说出 UITableVIew 的 Data Source 办法
CocoaTouch 框架中用到了大量委托,其中 UITableViewDelegate 就是委托机制的典型利用,是一个典型的应用委托来实现适配器模式,其中 UITableViewDelegate 协定是指标,tableview 是适配器,实现 UITableViewDelegate 协定,并将本身设置为 talbeview 的 delegate 的对象,是被适配器,个别状况下该对象是 UITableViewController。
UITableVIew 的 Data Source 办法有 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;
- (UITableViewCell )tableView:(UITableView )tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
37. 在利用中能够创立多少 autorelease 对象,是否有限度?
38. 如果咱们不创立内存池,是否有内存池提供给咱们?
界面线程保护着本人的内存池,用户本人创立的数据线程,则须要创立该线程的内存池
39. 什么时候须要在程序中创立内存池?
用户本人创立的数据线程,则须要创立该线程的内存池
40. 类 NSObject 的那些办法常常被应用?
NSObject 是 Objetive- C 的基类,其由 NSObject 类及一系列协定形成。
其中类办法 alloc、class、description 对象办法 init、dealloc、– performSelector:withObject:afterDelay: 等常常被应用
41. 什么是简便构造方法?
简便构造方法个别由 CocoaTouch 框架提供,如 NSNumber 的 + numberWithBool: + numberWithChar: + numberWithDouble: + numberWithFloat: + numberWithInt:
Foundation 下大部分类均有简便构造方法,咱们能够通过简便构造方法,取得零碎给咱们创立好的对象,并且不须要手动开释。
42. 如何应用 Xcode 设计通用利用?
应用 MVC 模式设计利用,其中 Model 层实现脱离界面,即在 Model 层,其是可运行在任何设施上,在 controller 层,依据 iPhone 与 iPad(独有 UISplitViewController)的不同特点抉择不同的 viewController 对象。在 View 层,可依据事实要求,来设计,其中以 xib 文件设计时,其设置其为 universal。
43. UIView 的动画成果有那些?
有很多,如 UIViewAnimationOptionCurveEaseInOut UIViewAnimationOptionCurveEaseIn UIViewAnimationOptionCurveEaseOut UIViewAnimationOptionTransitionFlipFromLeft UIViewAnimationOptionTransitionFlipFromRight UIViewAnimationOptionTransitionCurlUpUIViewAnimationOptionTransitionCurlDown
44. 在 iPhone 利用中如何保留数据?
有以下几种保留机制:
1). 通过 web 服务,保留在服务器上
2). 通过 NSCoder 固化机制,将对象保留在文件中
3). 通过 SQlite 或 CoreData 保留在文件数据库中
45. 什么是 coredata?
coredata 是苹果提供一套数据保留框架,其基于 SQlite
46. 什么是 NSManagedObject 模型?
NSManagedObject 是 NSObject 的子类,也是 coredata 的重要组成部分,它是一个通用的类, 实现了 core data 模型层所需的基本功能,用户可通过子类化 NSManagedObject,建设本人的数据模型。
47. 什么是 NSManagedobjectContext?
NSManagedobjectContext 对象负责利用和数据库之间的交互。
48. 什么是谓词?
谓词是通过 NSPredicate,是通过给定的逻辑条件作为约束条件,实现对数据的筛选。
predicate?=?[NSPredicate?predicateWithFormat:@"customerID?==?%d",n];
a?=?[customers?filteredArrayUsingPredicate:predicate];
49. 和 coredata 一起有哪几种长久化存储机制?
存入到文件、存入到 NSUserDefaults(零碎 plist 文件中)、存入到 Sqlite 文件数据库
50. 谈谈对 Block 的了解? 并写出一个应用 Block 执行 UIVew 动画?
Block 是能够获取其余函数局部变量的匿名函数,其岂但不便开发,并且能够大幅提高利用的执行效率(多外围 CPU 可间接解决 Block 指令)
[UIView?transitionWithView:self.view
duration:0.2
options:UIViewAnimationOptionTransitionFlipFromLeft
animations:^{?[[blueViewController?view]?removeFromSuperview];?[[self?view]?insertSubview:yellowViewController.view?atIndex:0];?}
completion:NULL];
51. 写出下面代码的 Block 的定义。
typedef?void(^animations)?(void);
typedef?void(^completion)?(BOOL?finished);
52. 做过的我的项目是否波及网络拜访性能,应用什么对象实现网络性能?
ASIHTTPRequest 与 NSURLConnection
53. 简略介绍下 NSURLConnection 类及 + sendSynchronousRequest:returningResponse:error: 与– initWithRequest:delegate: 两个办法的区别?
NSURLConnection 次要用于网络拜访,其中 + sendSynchronousRequest:returningResponse:error: 是同步拜访数据,即以后线程会阻塞,并期待 request 的返回的 response,而– initWithRequest:delegate: 应用的是异步加载,当其实现网络拜访后,会通过 delegate 回到主线程,并其委托的对象。
54. 多线程是什么
多线程是个简单的概念,按字面意思是同步实现多项工作,进步了资源的应用效率,从硬件、操作系统、应用软件不同的角度去看,多线程被赋予不同的外延,对于硬件,当初市面上少数的 CPU 都是多核的,多核的 CPU 运算多线程更为杰出; 从操作系统角度,是多任务,当初用的支流操作系统都是多任务的,能够一边听歌、一边写博客; 对于利用来说,多线程能够让利用有更快的回应,能够在网络下载时,同时响应用户的触摸操作。
55. iOS 中的多线程
iOS 中的多线程,是 Cocoa 框架下的多线程,通过 Cocoa 的封装,能够让咱们更为不便的应用线程,做过 C ++ 的同学可能会对线程有更多的了解,比方线程的创建,信号量、共享变量有意识,Cocoa 框架下会不便很多,它对线程做了封装,有些封装,能够让咱们创立的对象,自身便领有线程,也就是线程的对象化形象,从而缩小咱们的工程,提供程序的健壮性。
GCD 是 (Grand Central Dispatch) 的缩写,从零碎级别提供的一个易用地多线程类库,具备运行时的特点,能充分利用多外围硬件。GCD 的 API 接口为 C 语言的函数,函数参数中少数有 Block,对于 Block 的应用参看这里,为咱们提供弱小的“接口”,对于 GCD 的应用参见本文
NSOperation 与 Queue
NSOperation 是一个抽象类,它封装了线程的细节实现,咱们能够通过子类化该对象,加上 NSQueue 来同面向对象的思维,治理多线程程序。
具体可参看这里:
- 一个基于 NSOperation 的多线程网络拜访的我的项目。
NSThread:
- NSThread 是一个控制线程执行的对象,它不如 NSOperation 形象,通过它咱们能够不便的失去一个线程,并管制它。但 NSThread 的线程之间的并发管制,是须要咱们本人来管制的,能够通过 NSCondition 实现。
iOS 多线程视频解说▼:
- 多线程 – 线程保活
- 多线程 –GCD 堆栈剖析
视频材料获取形式:
收费支付
获取时请备注:iOS 技术晋升视频【附带 2021 年学习方向纲要图】;(PS: 请勿外传,仅限集体学习应用)
56. 在我的项目什么时候抉择应用 GCD,什么时候抉择 NSOperation?
我的项目中应用 NSOperation 的长处是 NSOperation 是对线程的高度形象,在我的项目中应用它,会使我的项目的程序结构更好,子类化 NSOperation 的设计思路,是具备面向对象的长处(复用、封装),使得实现是多线程反对,而接口简略,倡议在简单我的项目中应用。
我的项目中应用 GCD 的长处是 GCD 自身非常简单、易用,对于不简单的多线程操作,会节俭代码量,而 Block 参数的应用,会是代码更为易读,倡议在简略我的项目中应用。
57. 什么是 block
对于闭包(block), 有很多定义,其中闭包就是可能读取其它函数外部变量的函数,这个定义即靠近实质又较好了解。对于刚接触 Block 的同学,会感觉有些绕,因为咱们习惯写这样的程序 main(){ funA();} funA(){funB();} funB(){…..}; 就是函数 main 调用函数 A,函数 A 调用函数 B… 函数们顺次程序执行,但事实中不全是这样的,例如项目经理 M,手下有 3 个程序员 A、B、C,当他给程序员 A 安顿实现性能 F1 时,他并不等着 A 实现之后,再去安顿 B 去实现 F2,而是安顿给 A 性能 F1,B 性能 F2,C 性能 F3,而后可能去写技术文档,而当 A 遇到问题时,他会来找项目经理 M,当 B 做完时,会告诉 M,这就是一个异步执行的例子。在这种情景下,Block 便可大显神通,因为在项目经理 M,给 A 安顿工作时,同时会通知 A 若果遇到困难,如何能找到他报告问题(例如打他手机号),这就是项目经理 M 给 A 的一个回调接口,要回掉的操作,比方接到电话,百度查问后,返回网页内容给 A,这就是一个 Block,在 M 交待工作时,曾经定义好,并且获得了 F1 的工作号(局部变量),却是在当 A 遇到问题时,才调用执行,跨函数在项目经理 M 查问百度,取得后果后回调该 block。
block 视频解说▼:
- Block 堆栈、构造体探索
58. block 实现原理
Objective- C 是对 C 语言的扩大,block 的实现是基于指针和函数指针。
从计算语言的倒退,最早的 goto,高级语言的指针,到面向对象语言的 block,从机器的思维,一步步靠近人的思维,以不便开发人员更为高效、间接的形容出事实的逻辑 (需要)。
应用实例
cocoaTouch 框架下动画成果的 Block 的调用
应用 typed 申明 blocktypedef?void(^didFinishBlock)?(NSObject?*ob); 这就申明了一个 didFinishBlock 类型的 block,
而后便可用
@property?(nonatomic,copy)?didFinishBlock?finishBlock;
申明一个 blokc 对象,留神对象属性设置为 copy,接到 block 参数时,便会主动复制一份。
__block 是一种非凡类型,
应用该关键字申明的局部变量,能够被 block 所扭转,并且其在原函数中的值会被扭转。
59. 对于 block
面试时,面试官会先问一些,是否理解 block,是否应用过 block,这些问题相当于开场白,往往是上面一系列问题的开始,所以肯定要如实依据本人的状况答复。
60. 应用 block 和应用 delegate 实现委托模式有什么长处?
首先要理解什么是委托模式,委托模式在 iOS 中大量利用,其在设计模式中是适配器模式中的对象适配器,Objective- C 中应用 id 类型指向所有对象,使委托模式更为简洁。
理解委托模式的细节:
iOS 设计模式—- 委托模式
- 应用 block 实现委托模式,其长处是回调的 block 代码块定义在委托对象函数外部,使代码更为紧凑;
适配对象不再须要实现具体某个 protocol,代码更为简洁。
多线程与 block
- GCD 与 Block
- 应用 dispatch_async 系列办法,能够以指定的形式执行 block
- GCD 编程实例
- dispatch_async 的残缺定义
void?dispatch_async( dispatch_queue_t?queue, dispatch_block_t?block);
- 性能:
在指定的队列里提交一个异步执行的 block,不阻塞以后线程
通过 queue 来管制 block 执行的线程。
主线程执行前文定义的 finishBlock 对象
dispatch_async(dispatch_get_main_queue(),^(void){finishBlock();});
61. 谈谈 Object- C 的内存治理形式及过程?
1). 当你应用 new,alloc 和 copy 办法创立一个对象时, 该对象的保留计数器值为 1. 当你不再应用该对象时, 你要负责向该对象发送一条 release 或 autorelease 音讯. 这样, 该对象将在使用寿命完结时被销毁.
2). 当你通过任何其余办法取得一个对象时, 则假如该对象的保留计数器值为 1, 而且曾经被设置为主动开释, 你不须要执行任何操作来确保该对象被清理. 如果你打算在一段时间内领有该对象, 则须要保留它并确保在操作实现时开释它.
3). 如果你保留了某个对象, 你须要 (最终) 开释或主动开释该对象. 必须放弃 retain 办法和 release 办法的应用次数相等.
62.Object- C 有公有办法吗?公有变量呢?
objective-c – 类外面的办法只有两种, 静态方法和实例办法. 这仿佛就不是残缺的面向对象了, 依照 OO 的准则就是一个对象只裸露有用的货色. 如果没有了公有办法的话, 对于一些小范畴的代码重用就不那么棘手了. 在类外面声名一个公有办法
@interface?Controller?:?NSObject?{?NSString?*something;?}
+?(void)thisIsAStaticMethod;
–?(void)thisIsAnInstanceMethod;
@end
@interface?Controller?(private)?-
(void)thisIsAPrivateMethod;
@end
@private 能够用来润饰公有变量
在 Objective‐C 中,所有实例变量默认都是公有的,所有实例办法默认都是私有的
63.Object- C 有多继承吗?没有的话用什么代替?cocoa 中所有的类都是 NSObject 的子类
多继承在这里是用 protocol 委托代理 来实现的
你不必去思考繁琐的多继承 , 虚基类的概念.
ood 的多态个性 在 obj-c 中通过委托来实现.
64. 内存治理 Autorelease、retain、copy、assign 的 set 办法和含意?
1). 你初始化 (alloc/init) 的对象,你须要开释 (release) 它。
例如:
- NSMutableArray aArray = [[NSArray alloc] init]; 后,须要 [aArray release];
2). 你 retain 或 copy 的,你须要开释它。
例如:
- [aArray retain] 后,须要 [aArray release];
3). 被传递 (assign) 的对象,你须要斟酌的 retain 和 release。
例如:
- obj2 = [[obj1 someMethod] autorelease];
对象 2 接管对象 1 的一个主动开释的值,或传递一个根本数据类型 (NSInteger,NSString) 时:你或心愿将对象 2 进行 retain,以避免它在被应用之前就被主动开释掉。然而在 retain 后,肯定要在适当的时候进行开释。
对于索引计数 (Reference Counting) 的问题
retain 值 = 索引计数(Reference Counting)
NSArray 对象会 retain(retain 值加一)任何数组中的对象。当 NSArray 被卸载 (dealloc) 的时候,所有数组中的对象会 被 执行一次开释 (retain 值减一)。不仅仅是 NSArray,任何收集类(Collection Classes) 都执行相似操作。例如 NSDictionary,甚至 UINavigationController。
Alloc/init 建设的对象,索引计数为 1。无需将其再次 retain。
[NSArray array]和 [NSDate date] 等“办法”建设一个索引计数为 1 的对象,然而也是一个主动开释对象。所以是本地长期对象,那么无所谓了。如果是打算在全 Class 中应用的变量(iVar),则必须 retain 它。
缺省的类办法返回值都被执行了“主动开释”办法。(* 如上中的 NSArray)
在类中的卸载办法“dealloc”中,release 所有未被均衡的 NS 对象。(* 所有未被 autorelease,而 retain 值为 1 的)
65. C 和 obj-c 如何混用
1).obj- c 的编译器解决后缀为 m 的文件时,能够辨认 obj- c 和 c 的代码,解决 mm 文件能够辨认 obj-c,c,c++ 代码,但 cpp 文件必须只能用 c /c++ 代码,而且 cpp 文件 include 的头文件中,也不能呈现 obj- c 的代码,因为 cpp 只是 cpp
2). 在 mm 文件中混用 cpp 间接应用即可,所以 obj- c 混 cpp 不是问题
3). 在 cpp 中混用 obj- c 其实就是应用 obj- c 编写的模块是咱们想要的。
如果模块以类实现,那么要依照 cpp class 的规范写类的定义,头文件中不能呈现 obj- c 的货色,包含 #import cocoa 的。实现文件中,即类的实现代码中能够应用 obj- c 的货色,能够 import, 只是后缀是 mm。
如果模块以函数实现,那么头文件要按 c 的格局申明函数,实现文件中,c++ 函数外部能够用 obj-c,但后缀还是 mm 或 m。
总结:
- 只有 cpp 文件和 cpp include 的文件中不蕴含 obj- c 的货色就能够用了,cpp 混用 obj- c 的要害是应用接口,而不能间接应用 实现代 码,实际上 cpp 混用的是 obj- c 编译后的 o 文件,这个货色其实是无差别的,所以能够用。obj- c 的编译器反对 cpp
66. Objective- C 堆和栈的区别?
治理形式:
- 对于栈来讲,是由编译器主动治理,无需咱们手工管制;对于堆来说,开释工作由程序员管制,容易产生 memory leak。
申请大小:
栈:
- 在 Windows 下, 栈是向低地址扩大的数据结构,是一块间断的内存的区域。这句话的意思是栈顶的地址和栈的最大容量是零碎预先规定好的,在 WINDOWS 下,栈的大小是 2M(也有的说是 1M,总之是一个编译时就确定的常数),如果申请的空间超过栈的残余空间时,将提醒 overflow。因 此,能从栈取得的空间较小。
堆:
- 堆是向高地址扩大的数据结构,是不间断的内存区域。这是因为零碎是用链表来存储的闲暇内存地址的,天然是不间断的,而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中无效的虚拟内存。由此可见,堆取得的空间比拟灵便,也比拟大。
碎片问题:
- 对于堆来讲,频繁的 new/delete 势必会造成内存空间的不间断,从而造成大量的碎片,使程序效率升高。对于栈来讲,则不会存在这个问题,因为栈是先进后出的队列,他们是如此的一一对应,以至于永远都不可能有一个内存块从栈两头弹出
调配形式:
- 堆都是动态分配的,没有动态调配的堆。栈有 2 种调配形式:动态调配和动态分配。动态调配是编译器实现的,比方局部变量的调配。动态分配由 alloca 函数进行调配,然而栈的动态分配和堆是不同的,他的动态分配是由编译器进行开释,无需咱们手工实现。
调配效率:
- 栈是机器零碎提供的数据结构,计算机会在底层对栈提供反对:调配专门的寄存器寄存栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率比拟高。堆则是 C /C++ 函数库提供的,它的机制是很简单的。
67. ViewController 的 didReceiveMemoryWarning 怎么被调用:
[supper didReceiveMemoryWarning];
68. 什么时候用 delegate, 什么时候用 Notification?
delegate 针对 one-to-one 关系,用于 sender 承受到 reciever 的某个性能反馈值。
notification 针对 one-to-one/many/none,reciver, 用于告诉多个 object 某个事件。
69. 关键字 const 有什么含意?润饰类呢?static 的作用, 用于类呢? 还有 extern c 的作用 const 意味着 ” 只读 ”,上面的申明都是什么意思?
const?int?a;
int?const?a;
const?int?*a;
int?*?const?a;
int?const?*?a?const;
前两个的作用是一样,a 是一个常整型数。
第三个意味着 a 是一个指向常整型数的指针(也就是,整型数是不可批改的,但指针能够)。
第四个意思 a 是一个指向整型数的常指针(也就是说,指针指向的整型数是能够批改的,但指针是不可批改的)。
最初一个意味着 a 是一个指向常整型数的常指针(也就是说,指针指向的整型数是不可批改的,同时指针也是不可批改的)。
论断:
关键字 const 的作用是为给读你代码的人传播十分有用的信息,实际上,申明一个参数为常量是为了通知了用户这个参数的利用目标。
如果你曾花很多工夫清理其它人留下的垃圾,你就会很快学会感激这点多余的信息。(当然,懂得用 const 的程序员很少会留下的垃圾让他人来清理的)? 通过给优化器一些附加的信息,应用关键字 const 兴许能产生更紧凑的代码。正当地应用关键字 const 能够使编译器很天然地爱护那些不心愿被扭转的参数,避免其被无心的代码批改。简而言之,这样能够缩小 bug 的呈现。
1). 欲阻止一个变量被扭转,能够应用 const 关键字。在定义该 const 变量时,通常须要对它进行初始化,因为当前就没有机会再去扭转它了;
2). 对指针来说,能够指定指针自身为 const,也能够指定指针所指的数据为 const,或二者同时指定为 const;
3). 在一个函数申明中,const 能够润饰形参,表明它是一个输出参数,在函数外部不能扭转其值;
4). 对于类的成员函数,若指定其为 const 类型,则表明其是一个常函数,不能批改类的成员变量;
5). 对于类的成员函数,有时候必须指定其返回值为 const 类型,以使得其返回值不为“左值”。
70. 关键字 volatile 有什么含意? 并给出三个不同的例子。
一个定义为 volatile 的变量是说这变量可能会被意想不到地扭转,这样,编译器就不会去假如这个变量的值了。准确地说就是,优化器在用到这个变量时必须每次都小心地从新读取这个变量的值,而不是应用保留在寄存器里的备份。
上面是 volatile 变量的几个例子:
并行设施的硬件寄存器(如:状态寄存器)
一个中断服务子程序中会拜访到的非主动变量(Non-automatic variables)
多线程利用中被几个工作共享的变量
71. 一个参数既能够是 const 还能够是 volatile 吗?一个指针能够是 volatile 吗?解释为什么。
1). 是的。一个例子是只读的状态寄存器。它是 volatile 因为它可能被意想不到地扭转。它是 const 因为程序不应该试图去批改它。
2). 是的。只管这并不很常见。一个例子是当一个中服务子程序修该一个指向一个 buffer 的指针时。
72 . static 关键字的作用:
1). 函数体内 static 变量的作用范畴为该函数体,不同于 auto 变量,该变量的内存只被调配一次,因而其值在下次调用时仍维持上次的值;
2). 在模块内的 static 全局变量能够被模块内所用函数拜访,但不能被模块外其它函数拜访;
3). 在模块内的 static 函数只可被这一模块内的其它函数调用,这个函数的应用范畴被限度在申明它的模块内;
4). 在类中的 static 成员变量属于整个类所领有,对类的所有对象只有一份拷贝;
5). 在类中的 static 成员函数属于整个类所领有,这个函数不接管 this 指针,因此只能拜访类的 static 成员变量。
73. 线程与过程的区别和分割?
1). 过程和线程都是由操作系统所领会的程序运行的根本单元,零碎利用该根本单元实现系统对利用的并发性
2). 过程和线程的次要差异在于它们是不同的操作系统资源管理形式。
3). 过程有独立的地址空间,一个过程解体后,在保护模式下不会对其它过程产生影响,而线程只是一个过程中的不同执行门路。
4.)线程有本人的堆栈和局部变量,但线程之间没有独自的地址空间,一个线程死掉就等于整个过程死掉。所以多过程的程序要比多线程的程序强壮,但在过程切换时,消耗资源较大,效率要差一些。
5). 但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用过程。
74. 列举几种过程的同步机制,并比拟其优缺点。
原子操作 ? 信号量机制 ? ? 自旋锁 ? ? 管程,会合,分布式系统
75. 过程之间通信的路径
共享存储系统消息传递零碎管道:以文件系统为根底
76. 过程死锁的起因
资源竞争及过程推动程序非法
77. 死锁的 4 个必要条件
互斥、申请放弃、不可剥夺、环路
78. 死锁的解决
鸵鸟策略、预防策略、防止策略、检测与解除死锁
79. cocoa touch 框架
iPhone OS 应用程序的根底 Cocoa Touch 框架重用了许多 Mac 零碎的成熟模式,然而它更多地专一于触摸的接口和优化。
UIKit 为您提供了在 iPhone OS 上实现图形,事件驱动程序的根本工具,其建设在和 Mac OS X 中一样的 Foundation 框架上,包含文件解决,网络,字符串操作等。
Cocoa Touch 具备和 iPhone 用户接口统一的非凡设计。有了 UIKit,您能够应用 iPhone OS 上的独特的图形接口控件,按钮,以及全屏视图的性能,您还能够应用减速仪和多点触摸手势来管制您的利用。
各色俱全的框架 除了 UIKit 外,Cocoa Touch 蕴含了创立世界一流 iPhone 应用程序须要的所有框架,从三维图形,到业余音效,甚至提供设施拜访 API 以管制摄像头,或通过 GPS 获知以后地位。
Cocoa Touch 既蕴含只须要几行代码就能够实现全副工作的弱小的 Objective-C 框架,也在须要时提供根底的 C 语言 API 来间接拜访零碎。
框架包含:
Core Animation:
- 通过 Core Animation,您就能够通过一个基于组合独立图层的简略的编程模型来创立丰盛的用户体验。
Core Audio:
- Core Audio 是播放,解决和录制音频的业余技术,可能轻松为您的应用程序增加弱小的音频性能。
Core Data:
- 提供了一个面向对象的数据管理解决方案,它易于应用和了解,甚至可解决任何利用或大或小的数据模型。
性能列表:
- 框架分类
上面是 Cocoa Touch 中一小部分可用的框架:
音频和视频:
- Core Audio,OpenAL,Media Library,AV Foundation
数据管理:
- Core Data,SQLite
图形和动画:
- Core Animation,OpenGL ES,Quartz 2D
网络:
- Bonjour,WebKit,BSD Sockets
用户利用:
- Address Book,Core Location,Map Kit,Store Kit
80. 主动开释池是什么, 如何工作
当您向一个对象发送一个 autorelease 音讯时,Cocoa 就会将该对象的一个援用放入到最新的主动开释. 它依然是个正当的对象,因而主动开释池定义的作用域内的其它对象能够向它发送音讯。当程序执行到作用域完结的地位时,主动开释池就会被开释,池中的所有对象也就被开释。
主动开释池视频解说▼:
- 主动开释池
81. Objective- C 的优缺点。
objc 长处:
1). ?Cateogies
2). ?Posing
3). 动静辨认
4). 指标计算
5). 弹性讯息传递
6). 不是一个适度简单的 C 衍生语言
7).Objective-C 与 C++ 可混合编程
objc 毛病:
1). 不声援命名空间
2). 不反对运算符重载
3). 不反对多重继承
4). 应用动静运行时类型,所有的办法都是函数调用,所以很多编译时优化办法都用不到。(如内联函数等),性能低劣。
82. sprintf,strcpy,memcpy 应用上有什么要留神的中央。
1). sprintf 是格式化函数。将一段数据通过特定的格局,格式化到一个字符串缓冲区中去。sprintf 格式化的函数的长度不可控,有可能格式化后的字符串会超出缓冲区的大小,造成溢出。
2).strcpy 是一个字符串拷贝的函数,它的函数原型为 strcpy(char dst, const char src
将 src 开始的一段字符串拷贝到 dst 开始的内存中去,完结的标记符号为‘\0’,因为拷贝的长度不是由咱们本人管制的,所以这个字符串拷贝很容易出错。3). memcpy 是具备字符串拷贝性能的函数,这是一个内存拷贝函数,它的函数原型为 memcpy(char dst, const char src, unsigned int len); 将长度为 len 的一段内存,从 src 拷贝到 dst 中去,这个函数的长度可控。然而会有内存叠加的问题。
83. readwrite,readonly,assign,retain,copy,nonatomic 属性的作用
@property 是一个属性拜访申明,扩号内反对以下几个属性:
1).getter=getterName,setter=setterName,设置 setter 与 getter 的办法名
2).readwrite,readonly,设置可供拜访级别
3).assign,setter 办法间接赋值,不进行任何 retain 操作,为了解决原类型与环循援用问题
4).retain,setter 办法对参数进行 release 旧值再 retain 新值,所有实现都是这个程序(CC 上有相干材料)
5).copy,setter 办法进行 Copy 操作,与 retain 解决流程一样,先旧值 release,再 Copy 出新的对象,retainCount 为 1。这是为了缩小对上下文的依赖而引入的机制。
6).nonatomic,非原子性拜访,不加同步,多线程并发拜访会进步性能。留神,如果不加此属性,则默认是两个拜访办法都为原子型事务拜访。锁被加到所属对象实例级。
84. http 和 scoket 通信的区别。
http 是客户端用 http 协定进行申请,发送申请时候须要封装 http 申请头,并绑定申请的数据,服务器个别有 web 服务器配合(当然也非相对)。http 申请形式为客户端被动发动申请,服务器能力给响应,一次申请结束后则断开连接,以节俭资源。服务器不能被动给客户端响应(除非采取 http 长连贯 技术)。iphone 次要应用类是 NSUrlConnection。
scoket 是客户端跟服务器间接应用 socket“套接字”进行连贯,并没有规定连贯后断开,所以客户端和服务器能够放弃连贯通道,单方 都能够被动发送数据。个别在游戏开发或股票开发这种要求即时性很强并且放弃发送数据量比拟大的场合应用。次要应用类是 CFSocketRef。
85. TCP 和 UDP 的区别
TCP 全称是 Transmission Control Protocol,中文名为传输控制协议,它能够提供牢靠的、面向连贯的网络数据传递服务。
传输控制协议次要蕴含下列工作和性能:
- 确保 IP 数据报的胜利传递。
- 对程序发送的大块数据进行分段和重组。
- 确保正确排序及按程序传递分段的数据。
- 通过计算校验和,进行传输数据的完整性检查。
TCP 提供的是面向连贯的、牢靠的数据流传输,而 UDP 提供的是非面向连贯的、不牢靠的数据流传输。
简略的说,TCP 重视数据安全,而 UDP 数据传输快点,但安全性个别
86. 你理解 svn,cvs 等版本控制工具么?
版本控制 svn,cvs 是两种版管制的器, 须要配套相干的 svn,cvs 服务器。
scm 是 xcode 里配置版本控制的中央。版本控制的原理就是 a 和 b 同时开发一个我的项目,a 写完当天的代码之后把代码提交给服务器,b 要做的时候先从服务器失去最新版本,就能够接着做。如果 a 和 b 都要提交给服务器,并且同时批改了同一个办法,就会产生代码抵触,如果 a 先提交,那么 b 提交时,服务器能够提醒抵触的代码,b 能够清晰的看到,并做出相应的批改或交融后再提交到服务器。
87. 什么是 push。
客户端程序留下后门端口,客户端总是监听针对这个后门的申请,于是 服务器能够被动像这个端口推送音讯。
88. 动态链接库
此为.a 文件,相当于 java 里的 jar 包,把一些类编译到一个包中,在不同的工程中如果导入此文件就能够应用外面的类,具体应用仍然是 #import“xx.h”。
89. fmmpeg 框架
音视频编解码框架,外部应用 UDP 协定针对流媒体开发,外部开拓了六个端口来承受流媒体数据,实现疾速承受之目标。
90. fmdb 框架
数据库框架,对 sqllite 的数据操作进行了封装,应用着可把精力都放在 sql 语句下面。
91. 320 框架
ui 框架,导入 320 工程作为框架包如同增加一个一般框架一样。cover(open) ?flower 框架 (2d 仿射技术),外部外围类是 CATransform3D.
92. 什么是沙盒模型?哪些操作是属于公有 api 领域?
某个 iphone 工程进行文件操作有此工程对应的指定的地位,不能超越。
iphone 沙箱模型的有四个文件夹 documents,tmp,app,Library,永恒数据存储个别放 documents 文件夹,失去模拟器的门路的可应用 NSHomeDirectory()办法。Nsuserdefaults 保留的文件在 tmp 文件夹里。
93. 在一个对象的办法外面:self.name=“object”;和 name =”object”有什么不同吗?
self.name =”object”:会调用对象的 setName()办法;
name =“object”:会间接把 object 赋值给以后对象的 name 属性。
94. 请简要阐明 viewDidLoad 和 viewDidUnload 何时调用
viewDidLoad 在 view 从 nib 文件初始化时调用,loadView 在 controller 的 view 为 nil 时调用。此办法在编程实现 view 时调用,view 控制器默认会注册 memory warning notification,当 view controller 的任何 view 没有用的时候,viewDidUnload 会被调用,在这里实现将 retain 的 view release,如果是 retain 的 IBOutlet view 属性则不要在这里 release,IBOutlet 会负责 release。
95. 简述内存分区状况
1). 代码区:
- 寄存函数二进制代码
2). 数据区:
- 零碎运行时申请内存并初始化,零碎退出时由零碎开释。寄存全局变量、动态变量、常量
3). 堆区:
- 通过 malloc 等函数或 new 等操作符动静申请失去,需程序员手动申请和开释
4). 栈区:
- 函数模块内申请,函数完结时由零碎主动开释。寄存局部变量、函数参数
96. 队列和栈有什么区别:
队列和栈是两种不同的数据容器。从”数据结构”的角度看,它们都是线性构造,即数据元素之间的关系雷同。
队列是一种先进先出的数据结构,它在两端进行操作,一端进行入队列操作,一端进行出列队操作。
栈是一种先进后出的数据结构,它只能在栈顶进行操作,入栈和出栈都在栈顶操作。
- HTTP 协定中,POST 和 GET 的区别是什么?
1).GET 办法
GET 办法提交数据不平安,数据置于申请行,客户端地址栏可见;
GET 办法提交的数据大小无限
GET 办法不能够设置书签
2).POST 办法
POST 办法提交数据安全,数据置于音讯主体内,客户端不可见
POST 办法提交的数据大小没有限度
POST 办法能够设置书签
98. ?iOS 的零碎架构
iOS 的零碎架构分为:
- 外围操作系统层 theCore OS layer
- 外围服务层 theCore Services layer
- 媒体层 theMedia layer
- Cocoa 界面服务层 the Cocoa Touch layer
99. ? 控件次要响应 3 种事件
1). 基于触摸的事件 ;
2). 基于值的事件 ;
3). 基于编辑的事件。
100. ?xib 文件的形成分为哪 3 个图标?都具备什么性能。
File’s Owner 是所有 nib 文件中的每个图标,它示意从磁盘加载 nib 文件的对象;
First Responder 就是用户以后正在与之交互的对象;
View 显示用户界面;实现用户交互;是 UIView 类或其子类。
101. ? 简述视图控件器的生命周期。
loadView 只管不间接调用该办法,如多手动创立本人的视图,那么应该笼罩这个办法并将它们赋值给试图控制器的 view 属性。
viewDidLoad 只有在视图控制器将其视图载入到内存之后才调用该办法,这是执行任何其余初始化操作的入口。
viewDidUnload 当试图控制器从内存开释本人的办法的时候调用,用于分明那些可能曾经在试图控制器中创立的对象。
viewVillAppear 当试图将要增加到窗口中并且还不可见的时候或者下层视图移出图层后本视图变成顶级视图时调用该办法,用于执行诸如扭转视图方向等的操作。实现该办法时确保调用 [super viewWillAppear:
viewDidAppear 当视图增加到窗口中当前或者下层视图移出图层后本视图变成顶级视图时调用,用于搁置那些须要在视图显示后执行的代码。确保调用 [super viewDidAppear:]。
102. ? 动画有根本类型有哪几种;表视图有哪几种根本款式。
动画有两种根本类型:隐式动画和显式动画。
103. ? 实现简略的表格显示须要设置 UITableView 的什么属性、实现什么协定?
实现简略的表格显示须要设置 UITableView 的 dataSource 和 delegate 属性,实现 UITableViewDataSource 和 UITableViewDelegate 协定。
104. ?Cocoa Touch 提供了哪几种 Core Animation 过渡类型?
Cocoa Touch 提供了 4 种 Core Animation 过渡类型,别离为:穿插淡化、推挤、显示和笼罩。
105. ?UIView 与 CLayer 有什么区别?
1).UIView 是 iOS 零碎中界面元素的根底,所有的界面元素都是继承自它。它自身齐全是由 CoreAnimation 来实现的。它真正的绘图局部,是由一个 CALayer 类来治理。UIView 自身更像是一个 CALayer 的管理器,拜访它的跟绘图和跟坐标无关的属性。
2).UIView 有个重要属性 layer,能够返回它的主 CALayer 实例。
3).UIView 的 CALayer 相似 UIView 的子 View 树形构造,也能够向它的 layer 上增加子 layer,来实现某些非凡的示意。即 CALayer 层是能够嵌套的。
4).UIView 的 layer 树形在零碎外部,被保护着三份 copy。别离是逻辑树,这里是代码能够操纵的;动画树,是一个中间层,零碎就在这一层上更改属性,进行各种渲染操作;显示树,其内容就是以后正被显示在屏幕上得内容。
5). 动画的运作:
- 对 UIView 的 subLayer(非主 Layer)属性进行更改,零碎将主动进行动画生成,动画持续时间的缺省值仿佛是 0.5 秒。
6). 坐标零碎:
- CALayer 的坐标零碎比 UIView 多了一个 anchorPoint 属性,应用 CGPoint 构造示意,值域是 0~1,是个比例值。这个点是各种图形变换的坐标原点,同时会更改 layer 的 position 的地位,它的缺省值是 {0.5,0.5},即在 layer 的地方。
7). 渲染:
- 当更新层,扭转不能立刻显示在屏幕上。当所有的层都筹备好时,能够调用 setNeedsDisplay 办法来重绘显示。
8). 变换:
- 要在一个层中增加一个 3D 或仿射变换,能够别离设置层的 transform 或 affineTransform 属性。
9). 变形:
- Quartz Core 的渲染能力,使二维图像能够被自在操纵,就如同是三维的。图像能够在一个三维坐标系中以任意角度被旋转,缩放和歪斜。CATransform3D 的一套办法提供了一些魔术般的变换成果。
106. Quatrz 2D 的绘图性能的三个外围概念是什么并简述其作用。
上下文:次要用于形容图形写入哪里;
门路:
- 是在图层上绘制的内容;
状态:
- 用于保留配置变换的值、填充和轮廓,alpha 值等。
107. ?iPhone OS 次要提供了几种播放音频的办法?
SystemSound Services
AVAudioPlayer 类
Audio Queue Services
OpenAL
108. ? 应用 AVAudioPlayer 类调用哪个框架、应用步骤?
AVFoundation.framework
步骤:
- 配置 AVAudioPlayer 对象;
- 实现 AVAudioPlayer 类的委托办法;
- 管制 AVAudioPlayer 类的对象;
- 监控音量程度;
- 回放进度和拖拽播放。
109. ? 有哪几种手势告诉办法、写分明办法名?
-(void)touchesBegan:(NSSet)touchedwithEvent:(UIEvent)event;
-(void)touchesMoved:(NSSet)touched withEvent:(UIEvent)event;
-(void)touchesEnded:(NSSet)touchedwithEvent:(UIEvent)event;
-(void)touchesCanceled:(NSSet)touchedwithEvent:(UIEvent)event;
110. ?CFSocket 应用有哪几个步骤。
创立 Socket 的上下文;
创立 Socket;
配置要拜访的服务器信息;
封装服务器信息;
连贯服务器;
111. ?Core Foundation 中提供了哪几种操作 Socket 的办法?
CFNetwork、CFSocket 和 BSD Socket。
112. ? 解析 XML 文件有哪几种形式?
以 DOM 形式解析 XML 文件;以 SAX 形式解析 XML 文件;
113. ios 平台怎么做数据的长久化?coredata 和 sqlite 有无必然联系?coredata 是一个关系型数据库吗?
iOS 中能够有 四种长久化数据 的形式:
- 属性列表(plist)
- 对象归档
- SQLite3
- Core Data;
core data 能够使你以图形界面的形式疾速的定义 app 的数据模型,同时在你的代码中容易获取到它。
coredata 提供了根底构造去解决罕用的性能,例如保留,复原,撤销和重做,容许你在 app 中持续创立新的工作。
在应用 core data 的时候,你不必装置额定的数据库系统,因为 core data 应用内置的 sqlite 数据库。
core data 将你 app 的模型层放入到一组定义在内存中的数据对象。
coredata 会追踪这些对象的扭转,同时能够依据须要做相同的扭转,例如用户执行撤销命令。
当 core data 在对你 app 数据的扭转进行保留的时候,core data 会把这些数据归档,并永久性保留。
mac os x 中 sqlite 库,它是一个轻量级功能强大的关系数据引擎,也很容易嵌入到应用程序。
能够在多个平台应用,sqlite 是一个轻量级的嵌入式 sql 数据库编程。
与 core data 框架不同的是,sqlite 是应用程序式的,sql 的次要的 API 来间接操作数据表。
Core Data 不是一个关系型数据库,也不是关系型数据库管理系统 (RDBMS)。
尽管 Core Dta 反对 SQLite 作为一种存储类型,但它不能应用任意的 SQLite 数据库。
Core Data 在应用的过程种本人创立这个数据库。
Core Data 反对对一、对多的关系。
114. ?tableView 的重用机制?
UITableView 通过重用单元格来达到节俭内存的目标:
- 通过为每个单元格指定一个重用标识符(reuseIdentifier), 即指定了单元格的品种, 以及当单元格滚出屏幕时, 容许复原单元格以便重用. 对于不同品种的单元格应用不同的 ID, 对于简略的表格, 一个标识符就够了.
文末举荐:iOS 热门文集 & 视频解析
① Swift
② iOS 底层技术
③ iOS 逆向防护
④ iOS 面试合集
⑤ 大厂面试题 + 底层技术 + 逆向安防 +Swift
喜爱的小伙伴记得点赞喔~
珍藏等于白嫖,点赞才是真情ღ(´・ᴗ・`)ღ