iOS问题

来源:互联网 发布:电脑怎么打开淘宝口令 编辑:程序博客网 时间:2024/05/16 02:31

1. 请解释下method swizzling,并说出你一般什么时候会用到它?


MethodSwizzling是一种在运行时修改方法名与方法实现映射关系的技术,常用于在系统内部方法的基础上增加新的处理流程。


2. 假设有三个对象,一个父类的父类,一个父类和一个子类。父类的父类持有父类的引用(retain),父类持有子类的引用(retain),子类持有父类的引用(retain)。父类的父类释放(release)父类,解释下会发生什么。


父类被父类的父类释放掉以后,父类的引用计数-1,而因为子类拥有父类的计数,父类并未销毁。


3. 当一个空指针(nil pointer)调用了一个方法会发生什么?


安然无恙 —— 这是oc自带的消息机制,nil也能发送消息,而不会报错


4. 为什么retainCount绝对不能用在发布的代码中?请给出两个相对独立的解释。


a,因为retainCount不靠谱,不能真实的反映一个对象的引用计数

b,使用 alloc release等东西,一一对应,不需要retainCount
c,app已然推荐ARC,连release都不用了,更何况retainCount
wikis 
http://www.friday.com/bbum/2011/12/18/retaincount-is-useless/

http://whentouseretaincount.com


-retainCount受到时间和framework的影响太大,不能准确反映内存的引用计数

-retainCount很容易迷惑人,采取规范的内存管理才是王道


5. 请说明一下你查找或者解决内存泄露的处理过程。


利用Xcode的工具,

Analyze来看各种提示信息 (你可以在building setting里面开启各种烦人的提示)
Profile跟进一些具体的内存的点

跟进具体的代码,来看一些关键的点 block、delegate等


使用instruments作为动态分析的手段,还有Xcode的静态内存分析


6. 解释下自动回收池(autorelease pool)在程序运行时是如何运作的。


xcode为开发者写的代码外层包了一层NSAutoreleasePool。建立一个回收池堆栈(Stack)每次对象发送autorelease消息时,对象的引用计数并不真正变化,而是向pool中添加一条记录,记下对象的这种要求。最后当pool发送drain或release消息时,池中的所有对象的这种要求一一被执行。顺便说下使用场景:-应用不是基于"Application Kit",像"Command-line tool",因为它并没有内置的"autorelease pools"的支持。-创建线程,你必需在线程开始时创建一个'"Autorelease Pool"实例。反之,会造成内存池泄漏。一个循环内创建了太多的临时对象,你应该为他们创建一个"Autorelease Pool"对象,并在下次循环之前销毁它们。


7. 当处理属性申明的时候,原子(atomic)跟 非原子(non-atomic)属性有什么区别?


是否线程安全

atomic是原子的,多线程的时候,可以防止写操作完毕前被读取


事关多线程,原子(atomic)可以说是线程安全的,也就是在读取这个属性的变量的时候,会进行一些额外的操作(比如锁),所以说,atomic会比较安全电视比较耗时。


8. 在C语言中,你如何能用尽可能短的时间来倒转一个字符串?



9. 遍历一个NSArray和一个NSSet,哪一个更快?


其实意思是问,遍历一个链表和哈希表,哪个更快?

如果你只需要保存和遍历一些数据,就选择NSArray,或者元素个数比较小,那么及时需要查找的功能,也不要用NSSet.

只有在元素个数很大,或者需要保证数据唯一性的情况下,使用NSSet.


10. 解释代码签名(code signing)是如何运作的。

11. Objective-C中的posing指的是什么? 

12. 列举标准Xcode版本中的6个工具。

13. copy跟retain有什么区别?


一个是复制内容,一个引用计数+1,(NSString比较特殊,两个的功能几乎一样)需要注意的是,自定义的类需要重写一个方法以实现自己的深复制:

    -(id)copyWithZone:(NSZone *)Zone{

               grandSuper *scCopy;

              scCopy = [[[self class] allocWithZone:Zone]init];

              return scCopy;

    }


14. frames跟bounds有哪些区别?


frame相对于superView而言
bounds相对于自身的origin而言,一般是(0,0),设备朝向变化,bounds会变


15. 执行如下的代码会发生什么情况?


Ball *ball = [[[[Ball alloc] init] autorelease] autorelease]; 


崩溃,因为重复释放,在自动回收池下一次进行回收时崩溃


16. 列举5个iOS app的状态。

程序开始,程序暂停(挂起),程序进入后台,程序进入前台,程序重新激活,程序意外暂停

1.首次启动应用程序:程序开始,程序再次激活

2.按home键退出:程序暂停,程序进入后台

3.再次进入程序:程序进入前台,程序再次激活


0 0