填空题:
1._____关键字可以引用一个已经定义了的全局变量
2.定义一个空的类型,里面没有任何成员变量和成员函数,对该类型求sizeof的结果是____
3.HTTP协议中服务响应成功的状态码是______,状态码302表示____
4.UIView的直接父类是_____
5.iOS UI 的图形存储类型是______
6.定义“标准”宏MIN:_______
7.定义一个宏,需求输入一个16进制的颜色值,(如:0X3C60FF)返回一个UIColor对象:________
8.MVC设计模式考虑的三个对象:______, ________ ,_______
简答题:
1、__block 和 __weak的区别?
2、数组和链表的区别?
3、浅拷贝和深拷贝的区别?
4、堆内存和栈内存的区别是?
5、简述视图控制器的生命周期?
6、简述属性readwrite、readonly、assign、retain、copy、nonatomic的作用及应用场景?
编程题:
1、生成20个 1—10的随机整数,找出重复元素并打印出来。
2、使用GCD实现图片缓存。
面试题一:
1.Oc的类可以多重继承吗?可以实现多个接口吗?Category是什么?重写一个类的方式用继承好和还是分类好?为什么?
答:oc的类不可以多重继承,可以通过协议去实现多重继承。categary是类别,一般情况下用分类比较好,分类重写类方法不会影响到原有的类。
2.#import和#include有什么区别,@class呢? #import<>跟#import””又有什么区别?
答:#import是Object-C中导入头文件的关键字,#include是C/C++导入
文件的关键字;使用#import头文件只能自动导入一次,不会造成头文件的重复引用;
@class告诉编译器某个类的声明,当执行的时候才去查看类的实现文件,可以解决头文件的相互包含。
#import<>用来包含系统头文件,#import“”用来包含用户头文件
3.属性readwrite、readonly、assigned、retain、strong、copy、nonatomic各是什么作用,在那种情况下使用?
@property (nonatomic/atomic,retain/assign/copy, readonly/readwrite) Number* num;
@property (nonatomic/atomic, assign/retain/strong/weak/unsafe_unretained/copy,readonly/readwrite)Number* num;//默认为unsafe_unretained
readwrite是可读可写特性;需要生产getter方法和setter方法时;
readonly是只读特性,setter方法将传入参数赋值给实例变量;不希望属性在类外改变;
assign:是赋值特性,setter方法将传入参数赋值给实例变量;仅设置变量时;
retain:表示持有特性,setter方法将传入参数先保留,再赋值,传入参数的retaincount会+1;
copy表示拷贝特性,setter方法将传入对象复制一份;需要完全一份新的变量时。
nonatomic非原子操作,决定编译器生成的settergetter是否是原子操作。
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 = [strcopy];
[name release];
name = t;
}
5.对于语句NSString*obj=[NSStringalloc]init;obj在编译时和运行时分别是什么类型的对象?
答:编译是是NSString类型,运行时是NSData类型?
6.常见的Oc的数据类型有哪些?和C的基本数据类型有什么区别?如NSInteger 和Int?
答:OC的数据类型有NSSstring,NSNumber,NSArray,NSMutableArray,NSData等,这些都是类,创建后便是对象
C语言的基本数据类型int,不是类,只有一定字节的内存空间,用于存放数值。
NSInterger是基本数据类型,并不是NSNumber的子类,也不是NSObject的子类,NSInterger会根据系统是32为还是64为来确定数据本身是int还是Long(在jason数据解析的时候用到的了NSNumber)
7.id声明对象有什么特性?
答:id声明的对象具有运行时的特性,即可以指向任意类型的objective-c的对象
8.OC如果对内存对象管理的,说你的看法和解决方法?
MRC
(1)retain,该方法的作用是将内存数据的所有权附给另一指针变量,引用数加1,即 retainCount+= 1;
(2)release,该方法是释放指针变量对内存数据的所有权,引用数减1,即retainCount-= 1;
(3)autorelease,该方法是将该对象内存的管理放到autoreleasepool中。
9.内存管理的几条原则是什么?按摩默认法则,哪些关键字生成的对象需要手动释放?在和Property结合的时候怎样有效地避免内存泄露?
答:内存管理主要避免“过早释放”和“内存泄露”,对于“过早释放”需要注意@property设置特性时,一定要用对特性关键字,对于内存泄露,一定要申请了要负责释放,要细心。
使用new、alloc、copy关键字生成的对象和retain了的对象需要手动释放。设置为autorelease的对象不需要手动释放,会直接进入自动释放池。
10.如何对IOS进行性能测试?
Profile->Instruments ->Time Profiler
11.看下面的程序,第一个NSLog会输出什么
=======================================================
NSMutableArray* ary= [[NSMutableArray array] retain];
NSString *str =[NSString stringWithFormat:@"test"];
[strretain];
[aryaddObject:str];
NSLog(@"%@%d",str,[strretainCount]);
[strretain];
[strrelease];
[strrelease];
NSLog(@"%@%d",str,[strretainCount]);
[aryremoveAllObjects];
NSLog(@"%@%d",str,[strretainCount]);
=======================================================
答:str的retainCount创建+1,retain+1,加入数组自动+1 3
retain+1,release-1,release-1 2
数组删除所有对象,所有数组内的对象自动-1 1
12. Object C中创建线程的方法是什么?如果在主线程中执行代码,方法是什么?如果想延时执行代码、方法又是什么?
答:线程创建有三种方法:使用NSThread创建、使用GCD的dispatch、使用子类化的NSOperation,然后将其加入NSOperationQueue;
在主线程执行代码,方法是performSelectorOnMainThread,GCD使用方法是异步的主队列。
如果想延时执行代码可以用performSelector:onThread:withObject: afterDelay: 或者使用GCD的函数:dispatch_after(dispatch_time(DISPATCH_TIME_NOW,(int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
// 2秒后异步执行这里的代码...
});
13. 描述一下iOS SDK中如何实现MVC的开发模式
答:MVC是模型、视图、控制器开发模式,对于iOS SDK,所有的View都是视图层的,它应该独立于模型层,由视图器来控制。所有的用户数据都是模型层,它应该独立于视图。所有的ViewController都是视图器,由它负责控制视图,访问模型数据。
面试套题二:
14. Difference betweenshallow copy and deep copy?
答:潜拷贝只复制指针,深拷贝要复制内存。
前复制好比你的影子,你完蛋了,你的影子也完蛋了.
深复制好比你的克隆人,你完蛋了,克隆人还在。
15. What is advantage of categories?What is difference between implementing a category and inheritance?
答:分类的作用有三个:《UIButton+round》
1>将类的实现分散到多个不同文件件或多个不同框架中。
2>创建私有方法的前向引用
3>相对象添加非正式协议
扩展是一种特殊的分类,可以添加新的实例变量,并且添加的方法必须实现
继承可以增加,扩展父类方法,并且可以增加属性。
16. Difference betweencategories and extensions?
答:category和extensions的不同在于 后者可以添加属性。另外后者添加的方法是必须要实现的。extensions可以认为是一个私有的Category。
17. 4.Difference betweenprotocol in objective c and interfaces in java?
18. 5.What are KVO andKVC?
答:kvc:键 - 值编码:是一种间接访问对象的属性,是通过使用字符串来标识属性,而不是通过调用存取方法直接或通过实例变量访问的机制。
kvo:键值观察机制,他提供了观察某一属性变化的方法addObserver:forKeypath observerValueforPath:ofPath
19. What is purpose ofdelegates?
答:代理的目的是改变或传递控制链。允许一个类在某些特定时刻通知到其他类,而不需要获取到 那些类的指针。可以减少框架复杂度。
20. What are mutable andimmutable types in Objective C?
答:可修改不可修改的集合类。这个我个人简单理解就是可动态添加修改和不可动态添加修改一样。 比如NSArray和NSMutableArray。前者在初始化后的内存控件就是固定不可变的,后者可以添加等, 可以动态申请新的内存空间。
21. When we call objectivec is runtime language what does it mean?
答:运行时和多态;
运行时:运行时机制使我们直到运行时才去决定一个对象的类别,以及调用该类别对象指定方法。
多态:不同对象以自己的方式响应相同的消息的能力叫做多态。意思就是假设生物类(life)都用 有一个相同的方法-eat;那人类属于生物,猪也属于生物,都继承了life后,实现各自的eat,但 是调用是我们只需调用各自的eat方法。 也就是不同的对象以自己的方式响应了相同的消息(响 应了eat这个选择器)。
22. what is differencebetween NSNotification and protocol?
答:通知的结构有三方面构成:消息发送者、通知中心和suscriber构成。它可以一对多,一条消息可以发送给多个消息接受者。没有控制链的关系,发出消息后,所有的订阅者自动就会受到消息
协议的构成有一对一的关系。必须要继承协议,实现协议相关的方法。协议有控制链的关系。
23. What is pushnotification?
答:消息推送分为本地消息推送,和远程消息推送。
相同点:两种推送在ios中表现一致,可以通过横幅或者弹出提醒两种形式告诉用户,并且点击通知可以打开相应的应用程序。
不同点:本地推送是由本地应用触发的,是基于时间行为的一种通知形式。
远程推送:是有应用服务器提供商发起的,通过苹果的APNs(苹果消息推送服务器)发送到应用客户服务端。(做到时候还是有点麻烦,需要稍微百度一下)。
http://www.cnblogs.com/cdts_change/p/3240893.html
24. Polymorphism?
答:多态,父类指针指向子类对象。
方法的多态:
属性的多态:
25. Singleton?
答:应用场景:用户就是单例,networkmanager就是单例.
单例的写法有三种:一般的,安全的,define类型的。
26. What is responderchain?
答:程序的启动过程,事件传递链,响应链,和UIViewController的生命周期。
27. Difference betweenframe and bounds?
答:frame指的是:该View在父view坐标系统中的位置和大小。
Bounds指的是:该view在本身坐标系统中的位置和大小。
28. Difference betweenmethod and selector?
答:selector是一个方法的唯一标示,是方法的身份证编号。
Method是一个组合体,包含名字和实现
29. Is there any garbagecollection mechanism in Objective C.?
答:回答内存管理机制即可
30. NSOperation queue?
答:操作队列,同步,异步?
31. What is lazy loading?
答:只在用到的时候才去初始化
32. Can we use twotableview controllers on one viewcontroller?
答:可以,通过时用tabelview形成来实现方法。
33. Can we use onetableview with two different datasources? How you will achieve this?
34. 属性readwrite,readonly,assign,retain,copy,nonatomic,atomic各是什么作用,在那种情况下用?
readwrite是可读可写特性;需要生产getter方法和setter方法时;
readonly是只读特性,setter方法将传入参数赋值给实例变量;不希望属性在类外改变;
assign:是赋值特性,setter方法将传入参数赋值给实例变量;仅设置变量时;
retain:表示持有特性,setter方法将传入参数先保留,再赋值,传入参数的retaincount会+1;
copy表示拷贝特性,setter方法将传入对象复制一份;需要完全一份新的变量时。
nonatomic非原子操作,决定编译器生成的settergetter是否是原子操作。
atomic原子操作,表示多线程安全,一般使用nonatomic;
35. 描述程序的启动顺序? 响应链? 事件传递链? UIViewController的生命周期?
一程序的启动顺序?
1.先执行main函数,main内部会调用UIApplicationMain函数
2.UIApplicationMain函数里面做了以下事情
(1)创建UIApplication对象
(2)创建UIApplication的delegate对象—APPDelegate
(3)开启消息循环main runloop,每监听到对应的系统事件的时候,就会通知AppDelegate
(4)创建一个UIWindow对象(继承自UIView),设置为AppDelegatewindow属性
(5)加载Info.plist文件,读取最主要的storyboard文件的名称
(6)加载storyboard文件,创建白色箭头所指的控制器对象;
(7)设置创建的第(6)中的UIWindow的rootViewController属性(根控制器)
(8) 展示UIWindow,展示之前会添加rootViiewController的view到UIWindow上面(在 这一步才会创建控制器的view) [windowaddsubview;window.rootViewControler.view];
二响应者链
1.概念:
每一个应用有一个响应者链,我们的视图结构是一个N叉树(一个视图可以有多个子视图,一个
视图同一时刻只有一个父视图),而每一个继承UIResponder的对象都可以在这个N叉树中扮演一个节点。当叶节点成为最高响应者的时候,从这个叶节点开始往其父节点开始追朔出一条链,那么对于这一个叶节点来讲,这一条链就是当前的响应者链。响应者链将系统捕获到的UIEvent与UITouch从叶节点开始层层向下分发,期间可以选择停止分发,也可以选择继续向下分发。
2.例如:
我用SingleView模板创建了一个新的工程,它的主Window上只有一个UIViewController,其View之上有一个Button。这个项目中所有UIResponder的子类所构成的N叉树为这样的结构:
AppDelegate UIApplication UIWindow UIViewController UIView UIButton
实际上我们要把这棵树写完整,应该还要算上UIButton的UILabel和UIImageView,因为他们也是UIReponder的子类
3.如何工作:
用户手指触摸到了UIView上,由于我们没有重写UIView的UITouchEvent,所以他里面和super执行的一样的,将该事件继续分发到UIViewController;
UIViewController的TouchBegan被我们重写了,如果我们不super,那么我们在这里写响应代码。事件到这里就不继续分发了。可想而知,UIViewController祖先节点:UIWindow,UIApplication,AppDelegate都无权被分发此事件。
如果我们super了TouchBegan,那么此次触摸事件由 ViewController分发给UIWindow,UIWindow继而分发给UIApplication,UIApplication再分发给AppDelegate,于是我们在ViewController和appDelegate的touchBegan方法中都捕获到了这次事件。
三 事件传递链
1.事件的产生和传递:
(1)发生触摸事件后,系统会将该事件加入到一个由UIApplication管理的队列事件中
(2)UIApplication会从事件队列中取出最前面的事件,并将事件分发下去以便处理,通常会先发送事件给应用程序的主窗口(keyWindow)
(3)主窗口会在视图层次结构中找到一个最合适的视图来处理触摸事件
(4)找到合适的视图控件后,就会调用视图控件的touches方法来作事件的具体处理:touchesBegin...touchesMoved...touchesEnded等
(5)这些touches方法默认的做法是将事件顺着响应者链条向上传递,将事件叫个上一个相应者进行处理
2.事件传递的过程:
父控件传递到子控件
3.UIView不能接收触摸时间的三种情况:
(1)不接受用户交互:userInteractionEnabled= No;
(2)隐藏:hidden =YES;
(3)透明:alpha = 0.0~0.01
四UIViewController的生命周期?
1.调用顺序
(1)+(id)allco 分配内存;
(2)- (id)init 申请内存;只允许调用一次,并且要与 alloc方法 写在一起
(3) -(void)awakeFromNib 使用Xib初始化后会调用此方法,一般不会重写此方法;
(4)-(void)loadView 如果使用Xib创建ViewController,就不要重写该方法。一般不会 修改此方法;
(5)-(void)viewDidLoad 视图加载完成之后被调用,这个方法很重要,可以在此增加一 些自己定义的控件,注意此时view的frame不一定是显示时候的frame,真实的frame会在 -(void)viewDidAppear: 后
(6)-(void)viewWillAppear:(BOOL)animated view 将要显示的时候,可以在此加载一些 图片,和一些其他占内存的资源;
(7)-(void)viewDidAppear:(BOOL)animated view 已经显示的时候;
(8)-(void)viewWillDisappear:(BOOL)animated view 将要隐藏的时候,可以在此将一 些占用内存比较大的资源先释放掉,在 viewWillAppear: 中重新加载。如:图片/声音/视 频。如果View已经隐藏而又在内存中保留这些在显示前不会被调用的资源,那么App闪退 的几率会增加,尤其是ViewController比较多的时候;
(9) -(void)viewDidAppear:(BOOL)animated view 已经隐藏的时候;
(10)-(void)dealloc,不要手动调用此方法,当引用计数值为0的时候,系统会自动调 用此方法。
2.使用 NavigationController 去 Push 切换显示的View的时候,调用的顺序:
例如 从 A 控制器 Push 显示 B 控制器,[(A *)self.navigationController pushViewController:Banimated:YES]
(1) 加载B控制器的View(如果没有的话);
(2)调用 A 的 - (void)viewWillDisappear:(BOOL)animated;
(3)调用 B 的 - (void)viewWillAppear:(BOOL)animated;
(4)调用 A 的 - (void)viewDidDisappear:(BOOL)animated;
(5)调用 B 的 - (void)viewDidAppear:(BOOL)animated;
总结来说,ViewController 的切换是先调用 隐藏的方法,再调用显示的方法;先调用Will, 再调用Did。
3.重新布局View的子View
(1)- (void)viewWillLayoutSubviews
(2)- (void)viewDidLayoutSubviews看字面意思就知道这两个方法是在View对他的子View 进行布局的时候会被调用,包括View 显示/隐藏/屏幕旋转的时候都会被调用。
如果设计的应用需要支持多方向可以在这里面进行一些UI的横竖屏适配。
36.请简述IOS系统中的沙箱(SandBox)机制?
1.定义:IOS系统中,一个独立、封闭和安全的文件系统;
2.结构:
a.BundelContainer(Bundel容器)存放最终的.app包(可执行文件+Assert+Info.plist等)
b.DataContainer(数据容器)存放创建或下载的数据
/Documents:在程序的运行过程中产生的文件,并且需要备份;
/Library:程序运行过程中产生的文件,不需要备份;下载资源;
/library/Cashes:下载的所有的资源文件(不可备份)
/library/Preferences:配置文件:xxx.plist
/tmp:临时文件,一般不用
3.区别:bundel容器和数据容器的区别:前者只读,后者可读可写。
4.使用软件:simphoder软件(乒乓球拍)
37.写一个”标准”宏MIN,这个宏输入两个参数并返回较小的一个,写出单例模式的宏.
#defineMIN(X,Y) ((X):(Y)?(X)<(Y))
// .h
#definesingleton_interface(class) + (instancetype)shared##class;
// .m
#definesingleton_implementation(class) \
static class*_instance; \
\
+ (id)allocWithZone:(struct_NSZone *)zone \
{ \
static dispatch_once_t onceToken; \
dispatch_once(&onceToken, ^{ \
_instance = [superallocWithZone:zone]; \
}); \
\
return _instance; \
} \
\
+(instancetype)shared##class \
{ \
if(_instance == nil) { \
_instance = [[class alloc] init]; \
} \
\
return _instance; \
}
(2)声明
.h中 singleton_interface(KRUserInfo)
.m中singleton_implementation(KRUserInfo)
(3)运用
[KRUserInfoshardedKRUserInfo];
38.有多继承吗?如何实现多继承?
答:虽然Objective-C在语法上禁止类使用多继承,但是在协议的遵守上却允许使用多继承。所以可以用协议来实现多继承。可以通过组合的方法来实现多继承,C的成员变量有A 和 B ,C初始化时初始化A和B,
39.设计模式,MVC,单例,工厂,代理等的应用场景?
答:设计模式23种:创建类(工厂方法、单例)结构类(桥接、组合、代理)行为类(迭代器 观察者)
MVC 减少耦合度
单例:单例的应用场景,单例的三种写法
工厂方法:工厂方法让一个类的实例化延迟到子类中进行;工厂方法要解决的问题是对象的创建时机
代理,例子一,设置界面:页面A需要跳转到页面B(有可能会传入一些参数),页面B填写或者处理一些信息在跳转回页面A的同时还需要把数据返回A 例子二 网络请求:请求成功 请求失败 网络错误
代理的步骤: A三步:a.定义协议 b.delegate属性 c.调用时机 B 三步:a.遵循协议 b.设置代理 c.实现调用方法
1.单例?
3.代理
4.网络请求后在tableview上显示?
(1)总Control : httpString ->URL 异步方法去下载,回到主线程去赋值 回到主线程刷新tableview
(2)NetWorkingManager异步方式下载一般用NSSession对象 去创建一个data任务,在任务完成后用Json序列化Serialization解析数据 后用字典接收;接收到数组转化成模型
(3)DadaManager 将数据转换成模型
(4)model
4.写出三个死循环?
5.生成20个 1—10的随机整数,找出重复元素并打印出来?
A = rand()%10+1;
6.使用GCD实现图片缓存?
(1)如果内存中有数据就去内存中取数据
(2)如果内存中没有数据,文件中有数据,从文件中把数据区出来,并且把数据保存到内存中。
(3)如果内存中没有数据,文件中也没有数据,就异步下载数据,下载完成后把数据写入文件,把数据保存到内存中
(4)图片数据的下载,全局异步下载,回到主线程给图片赋值。
(5)找文件的路径,文件存到cash中,路径名最好就是图片名称。
三方库:AFNetworking XMPP MBProgressHUD SDWebImage
AFNetworking: AFHTTPSessionManager 发送请求结果是失败还是成功?
AFURLConnectionOperation 断点续传
XMPP:Openfire TomCat服务器
MBProgressHUD 是一个显示HUD窗口的第三方类库 loading动画视图、标题文本框、详情文本框、 UID背景框
SDWebImage:
多线程:NSOperation GCD NSThread
GCD:创建一个任务添加到队列中 让后通过两个不同的办法去执行;
队列分为并行队列和串行队列队列,并行队列就是两个队列中的任务是可以时分复用去同时执行;串行队列就是要一个一个去执行。
连个不同执行的方法就是同步和异步方法,同步会造成组设,异步不会造成阻塞;
死锁产生的条件:互不剥夺请保持循环。
NSOperation: NSBlockOperation
1.限制最大并发数量 2.取消或者暂停队列中的数量 3.设置任务之间的依赖关系
网络:NSSession Http Socket NS
地图:NSMapView CLLocation 百度地图
动画:UIView
布局:手动布局 代码布局
消息推送:本地推送 远程推送
第三方登陆:QQ 腾讯 人人
1.加载授权页面;2.输入用名和密码获取code;3.用code获取access_taken和UID 4.用access_taken进行注册或者登陆。
Cocopod的流程:下载三方库 更新三方库
图片压缩的两种方式:NSData * data =UIImageJPEGRepresentation(newImage, 0.05);