内存管理:
1 简述:
(1) java使用GC机制自动管理内存,Object-C支持手动管理内存,也支持GC机制,但GC机制对IOS设备无效,仅对Mac OSX电脑有效
(2) Object-C使用alloc,new,copy的时候为对象分配内存,然后返回分配的内存的首地址存入指针变量,使用dealloc释放内存
(3) Object-C中的对象都是使用指针引用的,也就是在方法调用的时候传递的都是指针.
2:内存回收机制
(1) 采用计数器retainCount来表示对象的引用次数,一个对象在被alloc之后就retainCount就是1,之后每调用一次retain方法retainCount都会加1.(这里的调用指得是:调用retain方法).调用release都会使retainCount减1.
(2) 当Object-C发现一个对象的retainCount计数器为0时,就会调用这个对象从NSObject继承而来的dealloc方法回收内存,这个调用动作是Object-c运行环境完成的.
(但这里每一个对象的retainCount永远不会为0,系统会进行判断,若对象的retainCount值为1时,此时再执行release方法不会将retainCount的值置为0,而是直接调用dealloc方法,但对象的retainCount一直为1,对象任指向当初的内存,若此时再对对象进行操作就会产生异常).
(3) 按照谁创建谁负责回收的原则
3 列如下面的操作:
-(void) dealloc{
[city release];
[super dealloc];
}
-(void) setCity: (NSMutableString*) c{
[c retain];//---1
[city release];//---2
city=c;//---3
} (测试:查看city release之后 c 的计数器retainCount的值)
{
因为变量之间传递的都是指针,所以当变量的引用执行retain或release方法时,原变量的retainCount也会发生相应的变化.
}
(1) 在java使用GC机制的语言中,我们只需要写第三条语句,若在Object-C中只写第三条语句,我们管这种方式获得的city叫做弱引用,也就是city只是通过赋值操作.把自己指向了C指向的对象,但是对象本身的引用计数器没有任何变化,此时City就要承担 [c release]之后所带来的风险.
(2) 大多数情况下,我们使用的是强引用(retain),先通过retain方法拿到对象的拥有权.
(3) 第二行代码目的:假如:city之前已指向一个对象,若不对city进行一次release,而直接把city指向c指向的对象,那么city原来指向的对象可能会出现内存泄露.
(4) 第一行代码和第二行代码顺序不能变换(原因:当把自己作为参数赋值给自己的时候,若先调用[c release] 那么回导致该对象的retainCount 变为0,从而被系统delloc回收,则[c retain] 就会报错).
(5) 当对象使用完后系统就会调用delloc方法,释放所有权.对象被release之后,指针任然指向当初的内存,若再调用对象的方法则会出现异常,可通过将指针赋值为nil ,虽然此时不会报错,但也屏蔽了错误.
4 iOS5及其以上版本不使用ARC机制的设置方法
- (1) TARGETS ➔ Build Phases ➔ Compile Sources ➔ 点击Compiler Flags ➔ 设置为-fno-objc-arc