盘点2016年iOS开发面试题及答案整理

在现如今,随着移动互联网科技不断的发展和创新,如今无论是公司还是开发者或设计师个人而言,面试都是一项耗时耗钱的项目,而面对iOS开发者及设计师在面试时可能会遇到的问题进行了筛选与汇总。下面我们一起来一下吧。

1、简述OC中内存管理机制。与retain配对使用的方法是dealloc还是release,为什么?需要与alloc配对使用的方法是dealloc还是release,为什么?readwrite,readonly,assign,retain,copy,nonatomic 、atomic、strong、weak属性的作用?

管理机制:使用了一种叫做引用计数的机制来管理内存中的对象。OC中每个对象都对应着他们自己的引用计数,引用计数可以理解为一个整数计数器,当使用alloc方法创建对象的时候,持有计数会自动设置为1。当你向一个对象发送retain消息 时,持有计数数值会增加1。相反,当你像一个对象发送release消息时,持有计数数值会减小1。当对象的持有计数变为0的时候,对象会释放自己所占用的内存。

retain(引用计数加1)->release(引用计数减1)

alloc(申请内存空间)->dealloc(释放内存空间)

readwrite: 表示既有getter,也有setter (默认)

readonly: 表示只有getter,没有setter

nonatomic:不考虑线程安全

atomic:线程操作安全 (默认)

线程安全情况下的setter和getter:

- (NSString*) value {

@synchronized(self) {

return [[_value retain] autorelease];

}}

(void) setValue:(NSString*)aValue {

@synchronized(self) {

[aValue retain];

[_value release];

_value = aValue;

} }

retain: release旧的对象,将旧对象的值赋予输入对象,再提高输入对象的索引计数为1

assign: 简单赋值,不更改索引计数 (默认)

copy: 其实是建立了一个相同的对象,地址不同(retain:指针拷贝 copy:内容拷贝)

strong:(ARC下的)和(MRC)retain一样 (默认)

weak:(ARC下的)和(MRC)assign一样, weak当指向的内存释放掉后自动nil化,防止野指针

unsafe_unretained 声明一个弱应用,但是不会自动nil化,也就是说,如果所指向的内存区域被释放了,这个指针就是一个野指针了。?autoreleasing 用来修饰一个函数的参数,这个参数会在函数返回的时候被自动释放。

2、类变量的@protected ,@private,@public,@package,声明各有什么含义?

@private:作用范围只能在自身类

@protected:作用范围在自身类和继承自己的子类 (默认)

@public:作用范围最大,可以在任何地方被访问。

@package:这个类型最常用于框架类的实例变量,同一包内能用,跨包就不能访问

3、线程是什么?进程是什么?二者有什么区别和联系?

一个程序至少有一个进程,一个进程至少有一个线程:

进程:一个程序的一次运行,在执行过程中拥有独立的内存单元,而多个线程共享一块内存

线程:线程是指进程内的一个执行单元。

联系:线程是进程的基本组成单位

区别:(1)调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位? (2)并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可并发执行? (3)拥有资源:进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源.? (4)系统开销:在创建或撤消进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或撤消线程时的开销。

举例说明:操作系统有多个软件在运行(QQ、office、音乐等),这些都是一个个进程,而每个进程里又有好多线程(比如QQ,你可以同时聊天,发送文件等)

4、谈谈你对多线程开发的理解?ios中有几种实现多线程的方法?

好处:

1.使用线程可以把占据时间长的程序中的任务放到后台去处理

2.用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的进度

3.程序的运行速度可能加快

4·在一些等待的任务实现上如用户输入、文件读写和网络收发数据等,线程就比较有用了。

缺点:

1.如果有大量的线程,会影响性能,因为操作系统需要在它们之间切换。

2.更多的线程需要更多的内存空间。

3.线程的中止需要考虑其对程序运行的影响。

4.通常块模型数据是在多个线程间共享的,需要防止线程死锁情况的发生。

实现多线程的方法:

NSObject类方法

NSThread

NSOperation

GCD

5、线程同步和异步的区别?IOS中如何实现多线程的同步?

异步:举个简单的例子 就是游戏,游戏会有图像和背景音乐

同步:是指一个线程要等待上一个线程执行完之后才开始执行当前的线程,上厕所

NSOperationQueue:maxcurrentcount

NSConditionLock

6、假设有一个字符串aabcad,请写一段程序,去掉字符串中不相邻的重复字符串,即上述字符串处理之后的输出结果为:aabcd

NSMutableString * str = [[NSMutableString alloc]initWithFormat;@“aabcad”];

for (int i = 0 ,i < str.length - 1 ;i++){

unsigned char a = [str characterAtIndex:i];

for (int j = i + 1 ,j < str.length ,j++){

unsigned char b = [str characterAtIndex:j];

if (a == b ){

if (j == i + 1){

}else{

[str deleteCharactersInRange:NSMakeRange(j, 1)];

}

}

}

}

NSLog(@“%@”,str);

7、获取一台设备唯一标识的方法有哪些?

(1)UDID

(2)UUID

(3)MAC Address

(4)OPEN UDID

(5)广告标识符

(6)Vindor标示符

8、iOS类是否可以多继承?如果没有,那可以用其他方法实现吗?简述实现过程。

不可以多继承 用protocol实现

9、堆和栈的区别?

堆需要用户手动释放内存,而栈则是编译器自动释放内存

问题扩展:要知道OC中NSString的内存存储方式

10、iOS本地数据存储都有哪几种方式?

NSKeyedArchiver

NSUserDefaults

Write写入方式

SQLite3

(问题扩展:什么情况下使用什么样的数据存储)

1.NSKeyedArchiver:采用归档的形式来保存数据,数据对象需要遵守NSCoding协议,对象对应的类必须提供encodeWithCoder:和initWithCoder:方法。缺点:只能一次性归档保存以及一次性解压。所以只能针对小量数据,对数据操作比较笨拙,如果想改动数据的某一小部分,需要解压或归档整个数据。

2.NSUserDefaults:用来保存应用程序设置和属性、用户保存的数据。用户再次打开程序或开机后这些数据仍然存在。NSUserDefaults可以存储的数据类型包括:NSData、NSString、NSNumber、NSDate、NSArray、NSDictionary。缺点:如果要存储其他类型,需要转换为前面的类型,才能用NSUserDefaults存储。

3.Write写入方式:永久保存在磁盘中。第一步:获得文件即将保存的路径:第二步:生成在该路径下的文件:第三步:往文件中写入数据:最后:从文件中读出数据:

4. SQLite:采用SQLite数据库来存储数据。SQLite作为一中小型数据库,应用ios中,跟前三种保存方式相比,相对比较复杂一些。

11、写出方法获取iOS内存使用情况。

// 获取当前设备可用内存及所占内存的头文件

#import

#import

// 获取当前设备可用内存(单位:MB)

- (double)availableMemory

{

vm_statistics_data_t vmStats;

mach_msg_type_number_t infoCount = HOST_VM_INFO_COUNT;

kern_return_t kernReturn = host_statistics(mach_host_self(),

HOST_VM_INFO,

(host_info_t)&vmStats,

&infoCount);

if (kernReturn != KERN_SUCCESS) {

return NSNotFound;

}

return ((vm_page_size *vmStats.free_count) / 1024.0) / 1024.0;

}

// 获取当前任务所占用的内存(单位:MB)

- (double)usedMemory

{

task_basic_info_data_t taskInfo;

mach_msg_type_number_t infoCount = TASK_BASIC_INFO_COUNT;

kern_return_t kernReturn = task_info(mach_task_self(),

TASK_BASIC_INFO,

(task_info_t)&taskInfo,

&infoCount);

if (kernReturn != KERN_SUCCESS

) {

return NSNotFound;

}

return taskInfo.resident_size / 1024.0 / 1024.0;

}

12、什么是安全释放?

置nil 再释放

13、写一个标准宏MIN,这个宏输入两个参数并返回较小的一个?

#define MIN(X,Y) ((X)>(Y)?(Y):(X))

扩展:在定义宏的时候需要注意哪些问题?

宏全部大写 写在#import 下 @interface上 结尾无分号

14、iphone os有没有垃圾回收机制?简单阐述一下OC内存管理。

iphone os没有垃圾回收机制 oc的内存管理是谁创建谁释放 程序中遇到retain 该对象引用计数+1 遇release该对象引用计数-1 retainCount为0时 内存释放

15、简述应用程序按Home键进入后台时的生命周期,以及从后台回到前台时的生命周期?

自己可以写个demo来测试一下

进入后台时

-(void)applicationWillResignActive:(UIApplication *)application;

-(void)applicationDidEnterBackground:(UIApplication *)application;

进入前台时

-(void)applicationDidEnterForeground:(UIApplication *)application;

-(void)applicationWillResignActive:(UIApplication *)application;

16、ViewController 的 alloc,loadView, viewDidLoad,viewWillAppear,viewDidUnload,dealloc、init分别是在什么时候调用的?在自定义ViewController的时候这几个函数里面应该做什么工作?

自己写代码测试加深理解

alloc申请内存时调用

loadView加载视图时调用

ViewDidLoad视图已经加载后调用

ViewWillAppear视图将要出现时调用

ViewDidUnload视图已经加载但没有加载出来调用

dealloc销毁该视图时调用

init视图初始化时调用

17、描述应用程序的启动顺序。

1. 程序入口main函数创建UIApplication实例和UIApplication代理实例。

2. 在UIApplication代理实例中重写启动方法,设置第一ViewController。

3. 在第一ViewController中添加控件,实现应用程序界面。

18、为什么很多内置类如UITableViewControl的delegate属性都是assign而不是retain?请举例说明。

防止循环引用

19、使用UITableView时候必须要实现的几种方法?

-(NSInteger)tableView:(UITableView*)tableViewNumberOfRowsInSection:(NSInteger)section;?这个方法返回每个分段的行数,不同分段返回不同的行数可以用switch来做,如果是单个列表就直接返回单个你想要的函数即可。?-(UITableViewCell*)tableView:(UITableView*)tableViewCellForRowAtIndexPath:(NSIndexPath)indexPath;?这个方法是返回我们调用的每一个单元格。通过我们索引的路径的section和row来确定

20、写一个便利构造器。

//id代表任意类型指针,这里代表Student *,类方法

+(id)studentWithName:(NSString *)newName andAge:(int)newAge?{? Student *stu=[[Student alloc]initName:newName andAge:newAge];? return [stu autorelease];//自动释放?}

21、UIImage初始化一张图片有几种方法?简述各自的优缺点。

3种

imageNamed:系统会先检查系统缓存中是否有该名字的Image,如果有的话,则直接返回,如果没有,则先加载图像到缓存,然后再返回。

initWithContentsOfFile:系统不会检查系统缓存,而直接从文件系统中加载并返回。

imageWithCGImage:scale:orientation当scale=1

时间: 2024-12-10 06:51:06

盘点2016年iOS开发面试题及答案整理的相关文章

objective-c/ios开发面试题(答案)

一.简答题 1.Objective-C的类可以多重继承么?可以采用多个协议么? 不可以多重继承,可以采用多个协议. 2.#import和#include的区别是什么?#import<> 跟 #import""有什么区别? #import能避免头文件被重复包含的问题: 1.  一般来说,导入objective c的头文件时用#import,包含c/c++头文件时用#include. 使用include要注意重复引用的问题: class A,class B都引用了class C

【面试】iOS 开发面试题(二)

1. 我们说的oc是动态运行时语言是什么意思? 答案:多态. 主要是将数据类型的确定由编译时,推迟到了运行时. 这个问题其实浅涉及到两个概念,运行时和多态. 简单来说,运行时机制使我们直到运行时才去决定一个对象的类别,以及调用该类别对象指定方法. 多态:不同对象以自己的方式响应相同的消息的能力叫做多态.意思就是假设生物类(life)都用有一个相同的方法-eat; 那人类属于生物,猪也属于生物,都继承了life后,实现各自的eat,但是调用是我们只需调用各自的eat方法. 也就是不同的对象以自己的

M牛C原创博客——IOS开发面试题(葵花宝典)

GCD怎么用的? ? 1.串行队列,同步操作,不会新建线程,操作顺序执行: ?   串行队列,异步操作,会新建线程,操作顺序进行,使用场景:既不影响主线程,又需要顺序执行的操作: ? 2.并行队列,同步操作,不会新建县城,操作顺序执行: ?   并行队列,异步操作,会新建线程,操作无序进行,队列前如果有其他任务,会等待其他任务执行完毕再执行: ? 全局队列是系统的,直接get就可以用 ? UI的更新工作必须在主线程进行, ? 全局队列异步操作,会新建对个子线程,操作无序执行,如果队列前有其他任务

【面试】iOS 开发面试题(一)

  1. #import 跟#include 又什么区别,@class呢, #import<> 跟 #import""又什么区别? 答:#import是Objective-C导入头文件的关键字,#include是C/C++导入头文件的关键字,使用#import头文件会自动只导入一次,不会重复导入,相当于#include和#pragma once;@class告诉编译器某个类的声明,当执行时,才去查看类的实现文件,可以解决头文件的相互包含;#import<>用来包

【面试】iOS 开发面试题(三)

1.iOS数据持久化存储方案有哪些? 参考答案: plist属性列表存储(如NSUserDefaults) 文件存储(如二进制数据写入文件存储,通过NSFileManager来操作将下载起来的二进制数据写一篇文件中存储) NSKeydeArchiver归档存储,常见的是自动化归档/解档处理,想要学习如何通过runtime实现自动化归档/解档,可 数据库SQLite3存储(如FMDB.Core Data) 2.沙盒的目录结构是怎样的?各自一般用于什么场合? 参考答案: Application:存放

ios开发面试题(二)

1.Difference between shallow copy and deep copy?浅复制和深复制的区别?答案:浅层复制:只复制指向对象的指针,而不复制引用对象本身.深层复制:复制引用对象本身.意思就是说我有个A对象,复制一份后得到A_copy对象后,对于浅复制来说,A和A_copy指向的是同一个内存资源,复制的只不过是是一个指针,对象本身资源还是只有一份,那如果我们对A_copy执行了修改操作,那么发现A引用的对象同样被修改,这其实违背了我们复制拷贝的一个思想.深复制就好理解了,内

ios开发面试题(一)

1.   Object-c的类可以多重继承么?可以实现多个接口么?Category是什么?重写一个类的方式用继承好还是分类好?为什么? Object-c的类不可以多重继承:可以实现多个接口,通过实现多个接口可以完成C++的多重继承:Category是类别,一般情况用分类好,用Category去重写类的方法,仅对本Category有效,不会影响到其他类与原有类的关系. 2.#import 跟#include 又什么区别,@class呢, #import<> 跟 #import”"又什么

iOS开发面试题(中级)

//想面试的童鞋们来看看自己会多少, 老鸟可以无视直接绕过...1. Object-c的类可以多重继承么?可以实现多个接口么?Category是什么?重写一个类的方式用继承好还是分类好?为什么?与Extension(延展)的主要区别? 答: Object-c的类不可以多重继承;可以实现多个接口,通过实现多个接口可以完成C++的多重继承;Category是类别(分类, 类目),一般情况用分类好,用Category去重写类的方法,仅对本Category有效,不会影响到其他类与原有类的关系.通常情况下

iOS开发面试题整理

1.类别的作用?继承和类别在实现中有何区别? category 可以在不获悉,不改变原来代码的情况下往里面添加新的方法,只能添加,不能删除修改.并且如果类别和原来类中的方法产生名称冲突,则类别将覆盖原来的方法,因为类别具有更高的优先级. 类别主要有3个作用: (1)将类的实现分散到多个不同文件或多个不同框架中. (2)创建对私有方法的前向引用. (3)向对象添加非正式协议. 继承可以增加,修改或者删除方法,并且可以增加属性. 2.KVO 和 KVC的区别? 答案:kvc:键 - 值编码是一种间接