1. objc的内存管理:
bjec内存管理采用引用计数的方式。当你使用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管理环境)由全手动内存管理上升到半自动化。
2. retain, copy, assign区别
(1)、assign是直接赋值。不会涉及引用计数问题,主要用于对objc基础数据类型(NSInteger、CGFloat等)和C基本数据类型(int 、double、float、char等)的赋值.
(2)、retain是指针拷贝,使用了引用计数,对对象进行retain操作之后将使对象的引用计数+1,增加了一个对原对象的引用。
(3)、copy是值拷贝,对对象进行copy操作之后相当于给原对象做了一份拷贝。新对象的值将和原对象相同,但是新对象和员对象各自有自己的内存地址,即,新对象的内存地址不同于原对象,所以,copy不会使员对象的引用计数递增。但是新对象的引用计数将递增为1,相当于创建了一个与原对象相同的新的对象。
(4)、atomic和nonatomic用来决定编译器生成的getter和setter是否为原子操作。在多线程环境下,原子操作是必要的,否则有可能引起错误的结果。加了atomic,setter函数会变成下面这样:
if (property != newValue) { [property release]; property = [newValue retain]; }
nonatomic属性表示禁止多线程,当某个对象不需要在多个线程中访问时该属性可以有效地提高效率,节省资源。
注意:retain不能用于基本数据类型,因为基本数据类型没有引用计数。copy属性只对实行了NSCopying协议的对象类型有效。当数据为int, float等原生类型时,可以使用assign。
3、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它。 这三条规则在写代码 的时候一定要遵守,一旦遵守了一般也就不会有内存泄露的问题。
4. 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,那需要根据用户自己的需求来实现了。