oc中的内存管理
对于oc来说由于在开发的过程中,对应的app会在iphone,ipad的上进行运行,如果像在其他语言开发的时候对内存的管理置之不理,那么在应用会不断的消耗内存,你会发现手机会出现卡顿现象,到一定的时间后应用甚至会崩溃。虽然说X-Code 给我们提供了ARC内存管理,但是手动管理内存依然是一个程序员的必修课。
- 手动管理内存首先要将项目配置到非ARC模式下,其方法如下:
手动管理内存的黄金法则为:
- 谁alloc ,谁release或者 autorelease
- 谁retain,谁release或者autorelease
- 有copy , 就有release活着autorelease
由于在进行复杂的时候有copy与mutablecopy这里就简单的介绍下二者的区别:其中NSString表示不可变对象,NSMutableString表示可变对象类型。
通过copy获取的对象是指针复制,其对应的retaincount会加1,即需要对其进行release。
mutableCopy是内容复制,产生一块新的地址存放,所以用 mutableCopy所产生的要分别使用不同的对象进行release:例如:
NSMutableString *str = [str1 MutableCopy];
//这里需要对str 使用release,str1 要release
[str release];
[str1 release];
NSString *str2 = [str3 Copy];
//这里对str3和str2释放,可以连续释放str2(3) 2次,或者str2 1次 str3 1次
[str2 release];
[str2 release];
今天在使用NSUserDefaults时,发现一个内存管理的问题。由于NSUserDefaults是一个单例对象,在其中加入了一个dic (dictionary)过后。每次通过 NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
获得对象的时候dic的retaincount都会自动加1,如果这时对dic进行release会报内存问题的错误。后来了解知道单例对象不需要进行内存管理,在程序执行结束后,单例销毁,对应的dic也被回收。
内存管理中的autorelease延迟减1,要在释放池结束后才释放。
@autoreleasepool {}
或者
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
/*
需要释放的内容
*/
[pool release];
常量的引用计数为正无穷,stringWithString initWithString 类似 @”1”其引用计数也是正无穷。
如果一个对象A中如果有需要管理内存的对象B,那么就需要在A的dealloc方法中对对象B进行release如图:
其中要调用[super dealloc];
如果对象A 中引用了 对象B,对象B 中需要引用对象A,那么为了避免循环引用,一个类中用@import , 一个类中使用@class,而且在内存释放的时候,要对一个对象赋值为nil,否者内存都不会进行释放。
一个对象放入集合中时,其引用计数会加1,在集合被release的时候,集合中的所有对象都会进行release,引用计数减1。