内存管理原则(配对原则):
只要出现了 new,alloc,retain,就一定配对出现一个release,autorelease。
保证代码中allo和release成对出现是保证内存管理的关键。
僵尸对象:被系统回收的对象我们称之为僵尸对象。
手动内存管理研究问题方法:
1、
野指针操作:指针对象被释放了之后(retainCount=0之后系统自动释放),再使用这个对象指针会造成的崩溃效果。
#import <Foundation/Foundation.h>
@interface Person : NSObject
@property int age;
- (void)run;
@end
#import "Person.h"
@implementation Person
- (void)dealloc
{
[super dealloc];
NSLog(@"Person 被销毁了");
}
- (NSString *)description
{
return [NSString stringWithFormat:@"age = %d",_age];
}
- (void)run
{
NSLog(@"人跑起来了");
}
@end
Person * p = [[Person alloc] init]; // retainCount = 1
p.age = 20;
NSLog(@"%@",p);
[p release]; // retainCount = 0 p将被系统自动释放
NSLog[@"%@",p] // 野指针
解决野指针的方法:如果确定当前作用于中的对象已经不会再被使用了,为了防止野指针操作,通常我们会把不在使用的指针变量赋值为nil,之后无论访问什么方法和属性都不会造成野指针,因为调用nil的任何属性和方法都是没效果的。
Person * p = [[Person alloc] init];
p.age = 20;
NSLog(@"%@",p);
[p release];
//如果你确定当前作用于中的对象已经不会再被使用了,为了防止野指针操作,通常我们会把不在使用的指针变量赋值为nil
p = nil;
p.age = 30;//[nil setAge:30];
[p run]; //[nil run];
2、
**内存泄漏**:指的就是,不再被使用的对象,一直在内存中没有被销毁.会造成程序内存在运行过程中内存占用很大,就会造成内存警告,最后系统自动闪退。
//内存泄漏第一种情况
//1
Person * p = [[Person alloc] init];
p.age = 20;
NSLog(@"%@",p);
//2
[p retain];
//3
[p retain];
//2
[p release];
//内存泄漏第一种情况
Person * p = [[Person alloc] init];
p.age = 20;
[p run];
p = nil;
[p release];//[nil release];
Person * p = [[Person alloc] init];
p.age = 20;
Person * p1 = p; // 两个指针指向同一个对象的内存空间
[p1 release]; // 内存被释放 不能在调用
[p.age = 10]; // 野指针
[p1.age = 10] // 野指针