本文收录:简书【超全!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.viewduration:0.2options:UIViewAnimationOptionTransitionFlipFromLeftanimations:^{?[[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,对于简略的表格,一个标识符就够了.