OC语言基础三:OC手动内存管理


OC手动内存管理又叫做手动引用计数,简称为MRC,IOS4.0之前使用的一种内存管理方式,之后提出了ARC。有了ARC我们可以把所有的精力放在项目的开发之上,系统给我们自动完成内存管理。

OC内存管理原则

只要使用以alloc,new, copy,mutableCopy, retain(这五个单词开头的方法)将一个对象的地址赋给一个指针变量时,该对象指针就拥有这个对象的绝对使用权,就会导致这个对象的引用计数加一,使用后就要进行release或autorelease来释放对象。(最终加一,减一的个数要一样,达到内存的平衡管理。)

示例

Build Settings里Objective-C Automatic Reference Counting参数默认是YES,改为NO。(搜索gar)

重写dealloc函数

-(void)dealloc{
   NSLog("person<%p>被销毁",self);
   [super dealloc];
}

每当我们去调用[super dealloc]的时候这个对象就已经被释放了,所以不能把一些逻辑写在这个方法调用之后。写在之后的话很可能因为去使用一个已经释放的对象而造成内存崩溃。

int main(int argc,const char *argv[]){
   @autoreleasepool{
     Person *person=[Person new];
     [person work];
    
    [person release];
   }
}

调[person release]会调dealloc函数,如果不调[person release]就会造成内存泄漏。
内存过度释放:
不如上面的例子:调用两次[person release],程序就会在dealloc 函数里崩溃。因为第二次调[person release]就相当于在使用一个不存在的对象,这是在对野指针进行操作。

int main(int argc,const char *argv[]){
   @autoreleasepool{
     Person *person=[Person new];
     [person work];
    [person release];
    [person work];

虽然第二个 [person work];访问的是僵尸对象,而系统是不会实时监测僵尸对象的,有时在你运行的时候监测到了,它会抛出异常,但有时恰巧你运行的时候它没有监测到僵尸对象这里,它是不会把异常及时得抛出的。
如果想及时得抛出异常,需要调整一个地方。
product-Scheme-Edit Scheme-run-Diagnostics-Enable Zombie Object钩上
person.retainCount,只需要记住retainCount是对象是否被销毁的唯一标志就行了,不要轻易得去使用它,如果非要使用,可能得到一些意想不到的结果,导致程序运行结果不准确。

autorelease的使用:

Person *person=[[[self alloc]init]autorelease];

被autorelease标记的类,放到autoreleasepool自动释放池里使用,就会被自动释放池所管理,当出了自动释放池的大括号之外,就会进行对象释放,是我们系统自动完成的,不需要我们操心person类的生命周期了。但是如果另外调了retain函数,就还需要调release释放一下。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值