iOS面试题集锦

iOS面试题集锦(1~10)

1. Objective-C的内存管理?

答:

1当你使用new,alloc和copy方法创建一个对象时,该对象的保留计数器值为1.当你不再使用该对象时,你要负责向该对象发送一条release或autorelease消息.这样,该对象将在使用寿命结束时被销毁.

2)每retain一次会使引用系数就加1,相应地要在适当位置release

2 浅谈iOS开发中几种基本的设计模式

答:

1)模型视图控制器(MVC)。控制器负责行为,模型提供数据源,视图显示UI。模型和视图之间尽量不要直接打交道,他们之间的交互应该通过控制器来进行,控制器充当着桥梁的作用。这样设计的目的是使不同功能的类之间尽量解耦,以利于程序的扩展。

2)代理模式

委托代理(degegate),名思,把某个象要做的事情委托给别象去做。那么象就是象的代理,代替它来打理要做的事。反映到程序中,首先要明确一个象的委托方是哪个象,委托所做的内容是什么。这里所做的内容是靠协议中的方法来实现,方法分两种:必需实现(@required)的方法和根据情况选择实现(@optional)的方法。

举个例子:你是房屋租赁中介,某个房东和你签订协议,请你替他把房子出租出去。这时,你就是房东的代理,你必须实现的方法是把屋子出租出去,选择实现的方法是装修、添置家具、打隔断等(依据协议而定)。

3)通知模式

通知模式是观察者模式的一种。a对象在通知中心注册了观察者之后,b对象发出通知广播,a对象收到通知后就知道去做具体的事。观察者可以是一个或多个,也可以没有。举个例子:微博切换帐号后会发出一个通知,让多个界面重新刷新数据。

4)KVO模式

Key-Value-Observer模式也是观察者模式的一种。KVO的机制为:当指定的被象的属性被修改的候,KVO都会自的去通知相察者。个例子,在控制器里通过addObserver:forKeyPath:options:context:注册一个数据源观察者,当数据源里的数据发生变化时,通过willChangeValueForKey:和didChangeValueForKey:这一对方法发出广播,控制器收到广播后就可以利用新的数据来刷新界面。

5)单例模式

通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。

单例模式有时也是出于现实逻辑的考虑,比如,一个学校只能有一个校长,校长对象应该就是一个单例对象。虽然从程序的角度你可以初始化多个校长,但这并不符合客观现实。

3.代理和通知的区别

答:

代理通常用于一对一的关系,通知可以是一对一或一对多或一对无的关系。代理的receive可以把结果返回给sender,通知的sender只负责把消息发送出去不需要返回结果

 

4.#import,#inlcude与@class的区别?

答:

1)假如有三个类A,B,C,B头文件中包含了C,A头文件包含了B和C,此时若用#include,则会提示C被重复定义的错误,而用#import则可以编译通过。这是因为#import会作判断,不会引起重复编译的问题。

2)@class仅是声明了一个类的名称,若在头文件中声明了@class,并声明了该类的对像,则在源文件中还要把该类#import进来。

假如有两个类X和Y,X中#import了Y,Y中#import了X,此时若在X中声明Y *y;或在Y中声明了X *x;编译时会报错:找不到Y或X的定义。

解决方法为在X,Y的头文件中用@class先声明,然后在源文件里#import

3)在iOS开发中,Objective-c类应使用#import,C/C++类应使用#include

 

5 请写出一个对象的setter方法和getter方法

答:

以NSObject对象为例,getter方法为:

-(NSObject *)object

{

return _object;

}

setter方法为:

-(void)setObject:(NSObject*)newObject

{

if(_object != newObject)

      {

            [_object release];

            _object = [newObject retain];

      }

}

(注,上面方法中若是NSString对象则应把retain改为copy)

 

6.Difference between shallowcopy and deep copy?
浅复制和深复制的区?


答:

复制:只复制指向象的指,而不复制引用象本身。


深复制:复制引用象本身。


比如有个A象,复制一份后得到A_copy象后,于浅复制来,A和A_copy指向的是同一个内存源,复制的只不是是一个指象本身源
是只有一份,那如果我们对A_copy行了修改操作,那么发现A引用的象同被修改 。深复制就好理解了,内存中存在了
两份独立象本身。


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

 

7.What is advantage ofcategories? What is difference between implementing a category and inheritance?类别的作用?承和类别实现中有何区?


答:

类别可以在不悉,不改原来代的情况下往里面添加新的方法,只能添加,不能修改。
并且如果类别和原来中的方法生名称冲突(名称重复),则类别将覆盖原来的方法,因为类别具有更高的。
类别主要有3个作用:
(1)将实现分散到多个不同文件或多个不同框架中。
(2)私有方法的前向引用。
(3)向象添加非正式协议

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

 

8.Difference between frame andbounds?
frame和bounds有什么不同?


答:

frame指的是:view在父view坐中的位置和大小。(参照点是父的坐


bounds指的是:view在本身坐中 的位置和大小。(参照点是本身坐。Bounds的左上角坐标通常都为(0,0),但也有例外,比如UIScrollView。

 

9.Difference between method and selector?
方法和选择器有何不同?


答:selector是一个方法的名字,method是一个合体,包含了名字和实现.

 

10.What is lazy loading?

答:

懒汉模式,只在用到的候才去初始化。
也可以理解成延。
最简单的一个列子就是tableView中片的加载显示了。
一个延时加载,避免内存高,一个异步加,避免线程堵塞。

原文地址:https://www.cnblogs.com/sunminmin/p/4516525.html