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",常量区的空间是由系统管理的
}
内存管理问题的总结(最强王者组:胡鹏飞 孙晓萌 张西辉 王振波)
最新推荐文章于 2025-05-02 19:12:37 发布