内存管理问题的总结(最强王者组:胡鹏飞 孙晓萌 张西辉 王振波)

1.内存管理的基本原则:
   如果对一个对象进行alloc ,retain ,copy 之后,你就拥有了该对象的所有权,你就必须对它进行release或者autorelease
2.内存管理常用的计数方法:
  Manual Reference Count(MRC),人工引用计数
  Auto Reference Count(ARC),自动引用计数
3.People *per1 = [[People alloc] init];   //0 - 1   alloc  开辟内存空间,并且将对象的引用计数由0变1.
  NSLog(@"%ld",[per1 retainCount]);retainCount  用来获取当前对象的引用计数
  People *per2 =  [per1 retain];//1-2  retain  将对象的引用计数加1
  [per2 retain];//2-3
  [per2 release];//3-2  release将对象的引用计数(立即)-1
  [per2 release];//2-1
  [per2 release];//1-0
在次,如果你在[per2 release];一次,就会出现过度释放问题.下面给出原因,解决方案.
     现象:当写完和内存引用计数-1有关的操作后,程序立即crash
     原因:空间被系统回收之后,不能在做和引用计数-1有关的操作,否则立即crash
     解决方案:删除
同时,在这里还会存在另一个问题:野指针现象
     现象:可能会崩溃,也可能不会崩溃,写到某一行代码时突然崩溃,(没有写任何和引用计数相关的代码)
     产生原因:该对象的空间已经被系统回收,不能访问没有所有权的对象
     解决方案:空间被系统回收之后,禁止访问
4.autorelease
  (1) autorelease  会将声明为autorelease的对象放入离它最近的自动释放池中,当自动释放池销毁时,会向池中的每一个对象发送一个release消息
  (2) autorelease  使用方式有两种:
     1). NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
       People *per = [[People alloc] init];//引用计数0 -1
       NSLog(@"%ld",[per retainCount]);
       [per autorelease];//1 -0
       [pool release];  (不经常用)

    2).@autoreleasepool {
       People *per = [[People alloc] init];//引用计数0 -1
       [per autorelease];//1 -0
       }
下面给出两道练习题:
1.@autoreleasepool {
        for (long i = 0; i < 10; i ++) {
             People *per = [[People alloc] init];
             [per autorelease];
           
        }
    }
在这道题中,存在内存泄露问题,只开辟空间,延缓释放,从而导致内存泄露问题.解决方案如下:
 @autoreleasepool {
        for (long i = 0; i < 10; i ++) {
            @autoreleasepool {
                People *per = [[People alloc] init];
                [per autorelease];
            }
        }
    }
2.
@autoreleasepool {
        NSString *per =[[NSString alloc] init];
        [per retain];
        [per retain];
        per = @"aa";  
        [per release];
        [per release];
        [per release];
在这道题中,由"aa"在常量区,per = "aa" 是指针变量重指向,从而导致两个问题:1.内存泄露 2.管理常量区的空间
解决方案:去掉per ="aa",常量区的空间是由系统管理的

    }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值