iOS学习第四天杂记--Objective-C中的内存管理
先说明下,原文为青玉伏案写的。我这只是学习而已。
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表示弱引用。
-----------------------------------------(我是分割线)
Object-C中的类目,扩展,http://blog.csdn.net/wuleihenbang/article/details/9076853
Object-C中的协议和代理(委托)设计模式:http://blog.csdn.net/wuleihenbang/article/details/9076579
-------------------(我是分割线)
Objective-C中的深拷贝和浅拷贝
-----------我是分割线(09-17更新)
单个对象的内存泄漏问题:
情况1: 创建完成 使用之后,没有release
Dog *d = [[Dog alloc] init];
NSLog(@"%lu", d.retainCount);
情况2: 没有遵守内存管理的原则(谁创建,谁release)
情况3: 不当的使用了nil,例如[nil 方法]这样,是没有效果的。
情况4: 在方法中对传入的对象进行了retain(违反了内存管理原则)。