面试题

iOS面试进阶篇(四)

2019-03-15  本文已影响49人  路飞_Luck
目录
1.Object-c的类可以多重继承么?可以实现多个接口么?Category是什么?重写一个类的方式用继承好还是分类好?为什么?
2.#import 跟#include 又什么区别,@class呢, #import<> 跟 #import””又什么区别?
3.属性readwrite,readonly,assign,retain,copy,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类型的对象

6.常见的object-c的数据类型有那些, 和C的基本数据类型有什么区别?如:NSInteger和int
7.id声明的对象有什么特性?

Id 声明的对象具有运行时的特性,即可以指向任意类型的objcetive-c的对象;

8.Objective-C如何对内存管理的,说说你的看法和解决方法?

Objective-C的内存管理主要有三种方式ARC(自动内存计数)手动内存计数内存池

解决: 通过alloc – initial方式创建的, 创建后引用计数+1, 此后每retain一次引用计数+1, 那么在程序中做相应次数的release就好了.

解决:一般是由类的静态方法创建的, 函数名中不会出现alloc或init字样, 如[NSString string]和[NSArray arrayWithObject:], 创建后引用计数+0, 在函数出栈后释放, 即相当于一个栈上的局部变量. 当然也可以通过retain延长对象的生存期.

解决:是由autorelease加入系统内存池, 内存池是可以嵌套的, 每个内存池都需要有一个创建释放对, 就像main函数中写的一样. 使用也很简单, 比如[[[NSString alloc]initialWithFormat:@”Hey you!”] autorelease], 即将一个NSString对象加入到最内层的系统内存池, 当我们释放这个内存池时, 其中的对象都会被释放.

9.原子(atomic)跟非原子(non-atomic)属性有什么区别?
NSMutableArray *ary = [[NSMutableArray array] retain];
NSString *str = [NSString stringWithFormat:@"test"];
[str retain];
[ary addObject:str];
NSLog(@"%@%d",str,[str retainCount]);
[str retain];
[str release];
[str release];
NSLog(@"%@%d",str,[str?retainCount]);
[ary removeAllObjects];
NSLog(@"%@%d",str,[str?retainCount]);

str的retainCount创建+1,retain+1,加入数组自动+1 3
retain+1,release-1,release-1 2
数组删除所有对象,所有数组内的对象自动-1 1

10.内存管理的几条原则时什么?按照默认法则.那些关键字生成的对象需要手动释放?在和property结合的时候怎样有效的避免内存泄露?
11.如何对iOS设备进行性能测试?

Profile-> Instruments ->Time Profiler

12.Object C中创建线程的方法是什么?如果在主线程中执行代码,方法是什么?如果想延时执行代码、方法又是什么?
13.MVC设计模式是什么? 你还熟悉什么设计模式?
14.浅复制和深复制的区别?

浅复制好比你和你的影子,你完蛋,你的影子也完蛋
深复制好比你和你的克隆人,你完蛋,你的克隆人还活着。

15.类别的作用?继承和类别在实现中有何区别?

category 可以在不获悉,不改变原来代码的情况下往里面添加新的方法,只能添加,不能删除修改,并且如果类别和原来类中的方法产生名称冲突,则类别将覆盖原来的方法,因为类别具有更高的优先级。

类别主要有3个作用:

继承可以增加,修改或者删除方法,并且可以增加属性。

16.类别和类扩展的区别。
17.oc中的协议和java中的接口概念有何不同?

其实关于正式协议,类别和非正式协议我很早前学习的时候大致看过,也写在了学习教程里

18.什么是KVO和KVC?
19.代理的作用?

代理的目的是改变或传递控制链。允许一个类在某些特定时刻通知到其他类,而不需要获取到那些类的指针。可以减少框架复杂度。
另外一点,代理可以理解为java中的回调监听机制的一种类似。

20.oc中可修改和不可以修改类型。

可修改不可修改的集合类
比如NSArray和NSMutableArray。前者在初始化后的内存控件就是固定不可变的,后者可以添加等,可以动态申请新的内存空间。

21.我们说的oc是动态运行时语言是什么意思?

答:多态。 主要是将数据类型的确定由编译时,推迟到了运行时。

这个问题其实浅涉及到两个概念,运行时和多态。

简单来说,运行时机制使我们直到运行时才去决定一个对象的类别,以及调用该类别对象指定方法。

22.通知和协议的不同之处?

协议有控制链(has-a)的关系,通知没有。

首先我一开始也不太明白,什么叫控制链(专业术语了~)。但是简单分析下通知和代理的行为模式,我们大致可以有自己的理解

只是对于不同明星间,代理的事物对象都是不一样的,一一对应,不可能说明天要处理A明星要一个发布会,代理人发出处理发布会的消息后,别称B的发布会了。但是通知就不一样,他只关心发出通知,而不关心多少接收到感兴趣要处理。

因此控制链(has-a从英语单词大致可以看出,单一拥有和可控制的对应关系。

23.什么是推送消息?

推送通知更是一种技术。

24.关于多态性

答:多态,子类指针可以赋值给父类。

25.对于单例的理解

答:在objective-c中要实现一个单例类,至少需要做以下四个步骤:

26.说说响应链

答: 事件响应链。包括点击事件,画面刷新事件等。在视图栈内从上至下,或者从下之上传播。

可以说点事件的分发,传递以及处理。具体可以去看下touch事件这块。

可以从责任链模式,来讲通过事件响应链处理,其拥有的扩展性

27. frame和bounds有什么不同?
28.方法和选择器有何不同?
29.OC的垃圾回收机制?
30.NSOperation queue?

存放NSOperation的集合类。

操作和操作队列,基本可以看成java中的线程和线程池的概念。用于处理ios多线程开发的问题。

网上部分资料提到一点是,虽然是queue,但是却并不是带有队列的概念,放入的操作并非是按照严格的先进现出。

31.什么是延迟加载?

懒汉模式,只在用到的时候才去初始化。

也可以理解成延时加载。

我觉得最好也最简单的一个列子就是tableView中图片的加载显示了。

32.什么时候使用NSMutableArray,什么时候使用NSArray?
33.给出委托方法的实例

CocoaTouch框架中用到了大量委托,其中UITableViewDelegate就是委托机制的典型应用,是一个典型的使用委托来实现适配器模式,其中UITableViewDelegate协议是目标,tableview是适配器,实现UITableViewDelegate协议,并将自身设置为talbeview的delegate的对象,是被适配器,一般情况下该对象是UITableViewController。

34.在应用中可以创建多少autorelease对象,是否有限制?

35. 如果我们不创建内存池,是否有内存池提供给我们?

界面线程维护着自己的内存池,用户自己创建的数据线程,则需要创建该线程的内存池

36.什么时候需要在程序中创建内存池?

用户自己创建的数据线程,则需要创建该线程的内存池

37.类NSObject的那些方法经常被使用?

答:NSObject是Objetive-C的基类,其由NSObject类及一系列协议构成。

其中类方法alloc、class、 description 对象方法init、dealloc、– performSelector:withObject:afterDelay:等经常被使用

38.什么是简便构造方法?

答:简便构造方法一般由CocoaTouch框架提供,如NSNumber的 + numberWithBool: + numberWithChar: + numberWithDouble: + numberWithFloat: + numberWithInt:

Foundation下大部分类均有简便构造方法,我们可以通过简便构造方法,获得系统给我们创建好的对象,并且不需要手动释放

39.如何使用Xcode设计通用应用?

使用MVC模式设计应用,其中Model层完成脱离界面,即在Model层,其是可运行在任何设备上,在controller层,根据iPhone与iPad(独有UISplitViewController)的不同特点选择不同的viewController对象。在View层,可根据现实要求,来设计,其中以xib文件设计时,其设置其为universal。

40.UIView的动画效果有那些?

有很多,如

UIViewAnimationOptionCurveEaseInOut
UIViewAnimationOptionCurveEaseIn 
UIViewAnimationOptionCurveEaseOut 
UIViewAnimationOptionTransitionFlipFromLeft 
UIViewAnimationOptionTransitionFlipFromRight 
UIViewAnimationOptionTransitionCurlUp
UIViewAnimationOptionTransitionCurlDown
41.在iPhone应用中如何保存数据?

答:有以下几种保存机制:

42.什么是coredata?

coredata是苹果提供一套数据保存框架,其基于SQlite

43.什么是NSManagedObject模型?

NSManagedObject是NSObject的子类 ,也是coredata的重要组成部分,它是一个通用的类,实现了core data 模型层所需的基本功能,用户可通过子类化NSManagedObject,建立自己的数据模型。

44.什么是NSManagedobjectContext?

NSManagedobjectContext对象负责应用和数据库之间的交互。

45.什么是谓词?

谓词是通过NSPredicate,是通过给定的逻辑条件作为约束条件,完成对数据的筛选。

46.和coredata一起有哪几种持久化存储机制?

存入到文件、 存入到NSUserDefaults(系统plist文件中)、存入到Sqlite文件数据库

47.谈谈对Block 的理解

Block是可以获取其他函数局部变量的匿名函数,其不但方便开发,并且可以大幅提高应用的执行效率(多核心CPU可直接处理Block指令)


更多同类型文章请参考

iOS面试进阶篇(一)
iOS面试进阶篇(二)
iOS面试进阶篇(三)
iOS面试进阶篇(四)
iOS面试进阶篇(五)


书写整理多不容易,觉得写的好的打赏一下吧。


更多相关类型文章敬请期待中

上一篇 下一篇

猜你喜欢

热点阅读