一套稍微难点的iOS面试题 第14题参考答案

14.Cocoa中与虚基类的概念么?怎么简洁的实现?

没有.多态用 Protocol来实现.简洁的实现就是写一个protocol .

15.自动释放池跟GC有什么区别?iPhone上有GC么?[pool release] 和[pool drain]有什么区别?

OBC2.0有Garbage collection,但是iOS平台不提供。
一般我们了解的objective-c对于内存管理都是手动操作的,但是也有自动释放池。
但是差了大部分资料,不要和arc机制搞混就好了。


虽然ARC引入之后NSAutoReleasePool的使用有了很大变化,但是了解NSAutoReleasePool的机制还是十分必要的,下面主要说一下:

NSAutoReleasePool * pool = [NSAutoReleasePool alloc] init];

//do something

之后,

[pool drain]

 和

 [pool release]

的区别:

release,在引用计数环境下,由于NSAutoReleasePool是一个不可以被retain的类型,所以release会直接dealloc pool对象。当pool被dealloc的时候,pool向所有在pool中的对象发出一个release的消息,如果一个对象在这个pool中autorelease了多次,pool对这个对象的每一次autorelease都会release。在GC环境下release是一个no-op操作(代表没有操作,是一个占据进行很少的空间但是指出没有操作的计算机指令)。

drain,在引用计数环境下,它的行为和release是一样的。在GC的环境下,这个方法调用objc_collect_if_needed出发GC。

因此,重点是:在GC环境下,release是一个no-op,所以除非你不希望在GC环境下出发GC,你都应该使用drain而不是使用release来释放pool。

简单来说,drain只是用于清除pool中对象,不会销毁池,release先调用drain方法清理对象,然后再释放自己内存。

 16.下面这段代码有什么问题?会不会造成内存泄露(多线程)?在内存紧张的设备上做大循环时自动释放池是写在循环内好还是循环外好?为什么?

for(int index = 0; index < 20; index ++)
{
    NSString *tempStr = @”tempStr”;
    NSLog(tempStr);
    NSNumber *tempNumber = [NSNumber numberWithInt:2];
    NSLog(tempNumber);
}

第一个问题,NSLog方法使用错误,可以编译通过,会报警告,但是运行程序是肯定Crash的,因为NSLog方法不能直接输出对象,而要添加输出格式控制符,因为tempStr和tempNubmer

都是OC对象,所以代码应改为

for(int index = 0; index < 20; index ++){
        NSString *tempStr = @"tempStr";
        NSLog(@"%@",tempStr);
        NSNumber *tempNumber = [NSNumber numberWithInt:2];
        NSLog(@"%@",tempNumber);
    }

第二个问题,不清楚

第三个问题,循环次数少可放在外面,次数多放在里面,原因不用等待循环结束的时候才释放内存,降低内存使用。

17.内存管理的几条原则时什么?按照默认法则.哪些关键字生成的对象需要手动释放?在和property结合的时候怎样有效的避免内存泄露?

1.1 谁创建,谁释放(类似于“谁污染,谁治理”)。如果你通过alloc、new或copy来创建一个对象,那么你必须调用release或autorelease。换句话说,不是你创建的,就不用你去释放。
例如,你在一个函数中alloc生成了一个对象,且这个对象只在这个函数中被使用,那么你必须在这个函数中调用release或autorelease。如果你在一个class的某个方法中alloc一个成员对象,且没有调用autorelease,那么你需要在这个类的dealloc方法中调用release;如果调用了autorelease,那么在dealloc方法中什么都不需要做。
1.2 除了alloc、new或copy之外的方法创建的对象都被声明了autorelease。
1.3 谁retain,谁release。只要你调用了retain,无论这个对象是如何生成的,你都要调用release。有时候你的代码中明明没有retain,可是系统会在默认实现中加入retain。不知道为什么苹果公司的文档没有强调这个非常重要的一点。

用alloc  new生成的对象需要手动释放。

第三个问题参见 问题11。

18.在一个对象释放前.如果他被加到了notificationCenter 中.不在notificationcenter中remove这个对象可能会出现什么问题?

 

19.怎样实现一个 singleton的类.给出思路。

20.什么是序列化或者Acrchiving,可以用来做什么,怎样与copy结合,原理是什么?.

21.线程是什么? 有哪些注意事项.?

线程是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性。

线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉.

对于一些要求同时进行并且又要共享某些变量的并发操作,应该使用线程。

22.在iphone上有两件事情要做,请问是在一个线程里按顺序做效率高还是两个线程里做效率高?为什么?

23.runloop是什么?在主线程中的某个函数里调用了异步函数,怎么样block当前线程,且还能响应当前线程的timer事件,touch事件等.

24.ios平台怎么做数据的持久化?coredata和sqlite有无必然联系?coredata是一个关系型数据库吗?

iOS中可以有四种持久化数据的方式: 属性列表、对象归档、SQLite3和Core Data;core data可以使你以图形界面的方式快速的定义app的数据模型,同时在你的代码中容易获取到它。core data提供了基础结构去处理常用的功能,例如保存,恢复,撤销和重做,允许你在app中继续创建新的任务。在使用core data的时候,你不用安装额外的数据库系统,因为core data使用内置的sqlite数据库。core data将你app的模型层放入到一组定义在内存中的数据对象。core data会追踪这些对象的改变,同时可以根据需要做相反的改变,例如用户执行撤销命令。当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支持对一、对多的关系。

25.阐述一个nil对象从interface bulider产生,到载入程序运行空间,最后被释放时所经历的生命周期.

26.notification是同步还是异步? kvo是同步还是异步?notification是全进程空间的通知吗?kvo呢?

27.kvc是什么?kvo是什么?有什么特性?

28.响应者链是什么?

29.unix上进程怎么通信?

UNIX主要支持三种通信方式:

   1. 基本通信:主要用来协调进程间的同步和互斥

   (1)锁文件通信

     通信的双方通过查找特定目录下特定类型的文件(称锁文件)来完成进程间  对临界资源访问时的互斥;例如进程p1访问一个临界资源,首先查看是否有一个特定类型文件,若有,则等待一段时间再查找锁文件。

   (2)记录锁文件

   2. 管道通信:适应大批量的数据传递

   3. IPC    :适应大批量的数据传递

30.timer的间隔周期准吗?为什么?怎样实现一个精准的timer?

31.UIscrollVew用到了什么设计模式?还能再foundation库中找到类似的吗?

模板(Template)模式,所有datasource和delegate接口都是模板模式的典型应用,

组合模式composition,所有的containerview都用了这个模式

观察者模式observer,所有的UIResponder都用了这个模式。

32如果要开发一个类似eclipse的软件,支持插件结构。且开放给第三方开发。你会怎样去设计它?(大概思路)

posted @ 2012-11-20 21:55  疯狂的萝卜  阅读(74)  评论(0编辑  收藏  举报