iOS 面试题

填空题: 

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如果对内存对象管理的,说你的看法和解决方法?

         答:ARC

          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))

              (1)Singleton.h

              // .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.单例?

2.Block

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);

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值