课程咨询 :400-017-8985

  • 一线互联网公司iOS面试题总结(2)

    发布:西安ios培训      来源:西安达内      时间:2015-10-21 16:08

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

    答:谁申请,谁释放

    遵循Cocoa Touch的使用原则;

    内存管理主要要避免“过早释放”和“内存泄漏”,对于“过早释放”需要注意@property设置特性时,一定要用对特性关键字,对于“内存泄漏”,一定要申请了要负责释放,要细心。

    关键字alloc 或new 生成的对象需要手动释放;

    设置正确的property属性,对于retain需要在合适的地方释放,

    12.如何对iOS设备进行性能测试?

    答: Profile-> Instruments ->Time Profiler

    13. Object C中创建线程的方法是什么?如果在主线程中执行代码,方法是什么?如果想延时执行代码、方法又是什么?

    答:线程创建有三种方法:使用NSThread创建、使用GCD的dispatch、使用子类化的NSOperation,然后将其加入NSOperationQueue;在主线程执行代码,方法是performSelectorOnMainThread,如果想延时执行代码可以用performSelector:onThread:withObject:waitUntilDone:

    14. MVC设计模式是什么? 你还熟悉什么设计模式?

    答:

    设计模式:并不是一种新技术,而是一种编码经验,使用比如java中的接口,iphone中的协议,继承关系等基本手段,用比较成熟的逻辑去处理某一种类型的事情,总结为所谓设计模式。面向对象编程中,java已经归纳了23种设计模式。

    mvc设计模式 :模型,视图,控制器,可以将整个应用程序在思想上分成三大块,对应是的数据的存储或处理,前台的显示,业务逻辑的控制。 Iphone本身的设计思想就是遵循mvc设计模式。其不属于23种设计模式范畴。

    代理模式:代理模式给某一个对象提供一个代理对象,并由代理对象控制对源对象的引用.比如一个工厂生产了产品,并不想直接卖给用户,而是搞了很多代理商,用户可以直接找代理商买东西,代理商从工厂进货.常见的如QQ的自动回复就属于代理拦截,代理模式在iphone中得到广泛应用.

    单例模式:说白了就是一个类不通过alloc方式创建对象,而是用一个静态方法返回这个类的对象。系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为,比如想获得[UIApplication sharedApplication];任何地方调用都可以得到 UIApplication的对象,这个对象是全局唯一的。

    观察者模式: 当一个物体发生变化时,会通知所有观察这个物体的观察者让其做出反应。实现起来无非就是把所有观察者的对象给这个物体,当这个物体的发生改变,就会调用遍历所有观察者的对象调用观察者的方法从而达到通知观察者的目的。

    工厂模式:

    		
    1. public class Factory{ 
    2. public static Sample creator(int which){ 
    3. if (which==1) 
    4. return new SampleA(); 
    5. else if (which==2) 
    6. return new SampleB(); 

    15 浅复制和深复制的区别?

    答:浅层复制:只复制指向对象的指针,而不复制引用对象本身。

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

    意思就是说我有个A对象,复制一份后得到A_copy对象后,对于浅复制来说,A和A_copy指向的是同一个内存资源,复制的只不过是是一个指针,对象本身资源

    还是只有一份,那如果我们对A_copy执行了修改操作,那么发现A引用的对象同样被修改,这其实违背了我们复制拷贝的一个思想。深复制就好理解了,内存中存在了

    两份独立对象本身。

    用网上一哥们通俗的话将就是:

    浅复制好比你和你的影子,你完蛋,你的影子也完蛋

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

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

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

    类别主要有3个作用:

    1).将类的实现分散到多个不同文件或多个不同框架中。

    2).创建对私有方法的前向引用。

    3).向对象添加非正式协议。

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

    17. 类别和类扩展的区别。

    答:category和extensions的不同在于 后者可以添加属性。另外后者添加的方法是必须要实现的。

    extensions可以认为是一个私有的Category。

    18. oc中的协议和java中的接口概念有何不同?

    答:OC中的代理有2层含义,官方定义为 formal和informal protocol。前者和Java接口一样。

    informal protocol中的方法属于设计模式考虑范畴,不是必须实现的,但是如果有实现,就会改变类的属性。

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

    “非正式协议概念其实就是类别的另一种表达方式“这里有一些你可能希望实现的方法,你可以使用他们更好的完成工作”。

    这个意思是,这些是可选的。比如我门要一个更好的方法,我们就会申明一个这样的类别去实现。然后你在后期可以直接使用这些更好的方法。

    这么看,总觉得类别这玩意儿有点像协议的可选协议。”

    现在来看,其实protocal已经开始对两者都统一和规范起来操作,因为资料中说“非正式协议使用interface修饰“,

    现在我们看到协议中两个修饰词:“必须实现(@requied)”和“可选实现(@optional)”。

    19. 什么是KVO和KVC?

    答:KVC:键 – 值编码是一种间接访问对象的属性使用字符串来标识属性,而不是通过调用存取方法,直接或通过实例变量访问的机制。

    很多情况下可以简化程序代码。apple文档其实给了一个很好的例子。

    KVO:键值观察机制,他提供了观察某一属性变化的方法,极大的简化了代码。

    具体用看到嗯哼用到过的一个地方是对于按钮点击变化状态的的监控。

    比如我自定义的一个button

    	
    1. [self addObserver:self forKeyPath:@"highlighted" options:0 context:nil]; 
    2. #pragma mark KVO 
    3. - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context 
    4. if ([keyPath isEqualToString:@"highlighted"] ) { 
    5. [self setNeedsDisplay]; 

    对于系统是根据keypath去取的到相应的值发生改变,理论上来说是和kvc机制的道理是一样的。

    对于kvc机制如何通过key寻找到value:

    “当通过KVC调用对象时,比如:[self valueForKey:@”someKey”]时,程序会自动试图通过几种不同的方式解析这个调用。首先查找对象是否带有 someKey 这个方法,如果没找到,会继续查找对象是否带有someKey这个实例变量(iVar),如果还没有找到,程序会继续试图调用 -(id) valueForUndefinedKey:这个方法。如果这个方法还是没有被实现的话,程序会抛出一个NSUndefinedKeyException异常错误。

    (cocoachina.com注:Key-Value Coding查找方法的时候,不仅仅会查找someKey这个方法,还会查找getsomeKey这个方法,前面加一个get,或者_someKey以及_getsomeKey这几种形式。同时,查找实例变量的时候也会不仅仅查找someKey这个变量,也会查找_someKey这个变量是否存在。)

    设计valueForUndefinedKey:方法的主要目的是当你使用-(id)valueForKey方法从对象中请求值时,对象能够在错误发生前,有最后的机会响应这个请求。这样做有很多好处,下面的两个例子说明了这样做的好处。“

    来至cocoa,这个说法应该挺有道理。

    因为我们知道button却是存在一个highlighted实例变量.因此为何上面我们只是add一个相关的keypath就行了,

    可以按照kvc查找的逻辑理解,就说的过去了。

    20. 代理的作用?

    答:代理的目的是改变或传递控制链。允许一个类在某些特定时刻通知到其他类,而不需要获取到那些类的指针。可以减少框架复杂度。

    另外一点,代理可以理解为java中的回调监听机制的一种类似。

上一篇:一线互联网公司iOS面试题汇总(1)

下一篇:一线互联网公司iOS面试题总结(3)

最新开班日期  |  更多

3G-IOS软件工程师周末班

3G-IOS软件工程师周末班

开班日期:05月31

3G-IOS软件工程师就业班

3G-IOS软件工程师就业班

开班日期:05月31

3G-IOS软件工程师周末班

3G-IOS软件工程师周末班

开班日期:05月31

3G-IOS软件工程师就业班

3G-IOS软件工程师就业班

开班日期:05月31

  • 地址:西安市长安北路8号陕西高速大厦15F
  • 课程培训电话:400-017-8985     全国服务监督电话:400-111-8989
  • 服务邮箱 tousu@tedu.cn
  • 2002-2018 达内时代科技集团有限公司 版权所有 京ICP证8000853号-56