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(违反了内存管理原则)。

posted on 2015-08-13 11:02  Fs_purple  阅读(171)  评论(0编辑  收藏  举报