oc中的内存管理

oc中的内存管理
对于oc来说由于在开发的过程中,对应的app会在iphone,ipad的上进行运行,如果像在其他语言开发的时候对内存的管理置之不理,那么在应用会不断的消耗内存,你会发现手机会出现卡顿现象,到一定的时间后应用甚至会崩溃。虽然说X-Code 给我们提供了ARC内存管理,但是手动管理内存依然是一个程序员的必修课。

  • 手动管理内存首先要将项目配置到非ARC模式下,其方法如下:
    这里写图片描述
    手动管理内存的黄金法则为:
    1. 谁alloc ,谁release或者 autorelease
    2. 谁retain,谁release或者autorelease
    3. 有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。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值