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

来源:互联网 发布:135端口还有漏洞吗 编辑:程序博客网 时间:2024/05/16 13:46
1.内存管理的基本原则:   如果对一个对象进行alloc ,retain ,copy 之后,你就拥有了该对象的所有权,你就必须对它进行release或者autorelease2.内存管理常用的计数方法:  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
原创粉丝点击