将自己这段时间的面试中遇到的一些问题做个纪录,也当作是自己学习一下~~
objective-c部分:
obj-c部分在面试中最常涉及到的就是内存管理和线程的一些东西~~当然还有一些记本算法的问题,这个应该是不属于objc语言部分,有过编程经验的都学基本的数据结构和算法,当然这也是做软件开发的重中之中~但是我个人认为,做iphone的上层应用开发的话对算法的要求不高,基本用不到~自己平时多看看基本的排序算法的实现,理解理解。再自己编写几个objc版本的实现就可以了(一般都是C、C++实现)。有快速排序、冒泡排序、插入排序等等等等~~还有树的遍历等~。好了,直入主题:
objc的内存管理:
objec内存管理采用引用计数的方式。当你使用new,alloc或copy创建对象时,对象的引用计数由0自增到1,调用release方法之后对象的引用计数减一,当切仅当对象的引用计数为0的时候dealloc方法将被自动调用,所以,我们应该尽量避免手动调用dealloc方法。因为可能代码的其他地方还存在对该对象的引用,调用dealloc方法将该对象释放之后可能会造成对该对象的非法引用而导致程序崩溃。
以下是有关objc对象的内存管理的一些API:
1,alloc, allocWithZone,new(带初始化)
为对象分配内存,retainCount为“1”,并返回此类的一个实例对象
2,release
retainCount 减“1”,减到“0”时将自动调用此对象的dealloc方法
3,retain
retainCount 加“1”
4,copy,mutableCopy
复制一个实例,retainCount数为“1”,返回此实例。所得到的对象是与其它上下文无关的,独立的对象(干净对象)。
5,autorelease
在当前上下文的AutoreleasePool栈顶的autoreleasePool实例添加此对象,由于它的引入使Objective-C(非GC管理环境)由全手动内存管理上升到半自动化。
一,retain, copy, assign区别
1、assign是直接赋值。不会涉及引用计数问题,主要用于对objc基础数据类型(NSInteger、CGFloat等)和C基本数据类型(int 、double、float、char等)的赋值。
假设你用malloc分配了一块内存,并且把它的地址赋值给了指针a,后来你希望指针b也共享这块内存,于是你又把a赋值给(assign)了b。此时a 和b将指向同一块内存。
2、retain是指针拷贝,使用了引用计数,对对象进行retain操作之后将使对象的引用计数+1,增加了一个对原对象的引用。
3、copy是值拷贝,对对象进行copy操作之后相当于给原对象做了一份拷贝。新对象的值将和原对象相同,但是新对象和员对象各自有自己的内存地址,即,新对象的内存地址不同于原对象,所以,copy不会使员对象的引用计数递增。但是新对象的引用计数将递增为1,相当于创建了一个与原对象相同的新的对象。
4、atomic和nonatomic用来决定编译器生成的getter和setter是否为原子操作。在多线程环境下,原子操作是必要的,否则有可能引起错误的结果。加了atomic,setter函数会变成下面这样:
}
注意:retain不能用于基本数据类型,因为基本数据类型没有引用计数。copy属性只对实行了NSCopying协议的对象类型有效。当数据为int, float等原生类型时,可以使用assign。
二、release与autorelease区别
这两个方法都会使对象的引用计数减一,不同之处在于,当release/autorelease操作使对象的引用计数为0的时候,如果执行的release,则将会立即调用dealloc释放掉该对象。相反如果用的使autorelease,该对象不会立即被释放,而是将该对象放到自动回收池中,当最近的一个pool被释放之后,该对象才会被执行dealloc释放。
总结:
1. 当你使用new,alloc或copy创建对象时,对象的count retain到1。你一定要负责把这个对象release 或 autolease掉。这样当它的生命周期结束时,它才能清空。
2. 当你使用 其他方法获得一个对象时,你可以认为它已经retain了一个count,并且autolease掉了。你不用考虑和它相关的清理问题 。但是如果你想保留这个对象,那么你需要retain它,并且要确保之后你release了这个对象。
3. 如果你retain一个对象,你最终总是需要release或者autolease它。
这三条规则在写代码 的时候一定要遵守,一旦遵守了一般也就不会有内存泄露的问题。
objc的多线程:
cocoa提供了NSOperation和NSThread类可以实现多线程。NSCondition类用于线程同步。有关多线程的详细描述见下面的链接~写的很清楚,明白。
http://www.cnblogs.com/chen1987lei/archive/2011/04/28/2032260.html
cocoa框架部分:
Cocoa是Mac OS和iPhone OS上的开发框架,使用Objective-C做为开发语言。当然,在代码中也可以嵌入C和C++的语句。
在Cocoa框架中,所有的控件、窗口等都继承自 UIView,对应MVC中的 V。UIView及其子类主要负责UI的实现,而UIView所产生的事件都可以采用委托的方式,交给UIViewController实现。对于不同的UIView,都有相应的UIViewController 对应MVC中的C。比如在iPhone OS上常用的UITableView,它所对应的Controller就是UITableViewController。至于MVC中的M,那需要根据用户自己的需求来实现了。
以下有一些自己在网上找到的资源:
有关loadView、viewDidLoad、viewDidUnload的调用方式和说明:
http://www.cnblogs.com/Piosa/archive/2012/02/22/2363179.html