先说明下,原文为青玉伏案写的。我这只是学习而已。
OC中的内存管理。
OC中使用引用计数和垃圾回收来管理内存,在OC中为每个对象分配一个引用计数器,当对象刚刚被创建时其初始值为1,当有某段代码需要访问一个对象时,会将该对象的引用计数器加1(通过retain来实现);当访问一个对象结束时,会将该对象的引用计数器减1(通过release来实现);当计数器为0时,该对象占用的内存空间会被收回。在NSObject类有一个retainCount方法,调用该方法可获取当前对象的引用计数值。
Tips:测试时如若需要用到retainCount,需要将xcode中的相关设置修改。
将YES改为NO即可。
1. 用可变的数组结合着可变的字符串来观察一下retainCount的变化。
? ? ?(1).先创建一个可变数组对象,在创建一个可变字符串对象--此时可变字符串的retainCount为1;
? ? ?(2).然后往可变数组里添加可变的字符串,观察可变字符串的retainCount的变化--往可变数组中每加一个对象,数组的retainCount +1。
? ? ?(3).在可变数组中移除一个str,观察retainCount的变化--可变数组的retainCount -1。
//用可变的数组来测试内存的访问 NSMutableArray *array = [NSMutableArray arrayWithCapacity:3]; //可变的字符串 NSMutableString *str = [[NSMutableString alloc] initWithString:@"aa"]; //这时的retainCount NSLog(@"新建str时的strRetain = %d",(int)[str retainCount]); [array addObject: str]; [array addObject: str]; NSLog(@"添加两个str元素后的strRetain = %d", (int)[str retainCount]); [array removeObjectAtIndex: 0]; NSLog(@"移除一个元素后strRetain = %d", (int)[str retainCount]);
? 2.NSString的retainCount的变化
? ? ?用NSString声明的字符串变量的retainCount变化由你初始化字符串时的方式决定
? ? ?1. 用NSString *str = @"ludashi";定义变量
? ? ? ?用上面的方法定义的字符串是常量字符串,他的retianCount为-1或不定,不会随着retian或者release变化而变化
Objective-C中得ARC(Automatic Reference Counting)
? 1.?ARC中应注意的问题:
? ? ?(1). 不能显式调用dealloc语句, 或者实现或调用retain, release, retianCount 和 autorelease等方法。
? ? ?(2).不能调用@selector (retain) ,@selector (release)等;
? ? ?(3).不能使用NSAutoreleasePool对象, 用@autoreleasepool块来代替;
? ? ?(4).不能用开头new的名称来定义一个属性,除非你定义一个别的getter名称。
? ?2.ARC特性
? ? ?ARC增加了新的属性定义关键字,strong来代替retain,表示强引用。用weak来代替assign表示弱引用。