野指针和内存泄露
// 1.内存泄露
Person *person = [[Person alloc]init]; // 1
NSLog(@"person count = %ld",person.retainCount);
[person retain]; // 2
Person *person1 = [person retain]; // 3
[person release];// 2
[person1 release];// 1
// 配对原则
// 对象的retainCount != 0的时候 不会调用dealloc方法
// 函数销毁对象,对象会一直存在内存中造成内存泄露
// 2.内存泄露
Person *person2 = [[Person alloc]init];
person2 = nil;
// [person release];
NSLog(@"person2 --- = %ld",[person2 retainCount]); // 0
// 3.野指针
Person *person3 = [[Person alloc]init];
NSLog(@"person3 count = %ld",person3.retainCount);
Person *person4 = [person3 retain];
[person3 release];
[person4 release];
// NSLog(@"person3 count = %ld",person3.retainCount);
// 打印野指针的retainCount
person3 = nil;
person4 = nil;
[person3 run]; // [nil run];
// 对象访问了不可访问的空间
// 4.
// 在一个对象调用dealloc 函数销毁之后
// 是不会起死回生的
Person *person5 = [[Person alloc]init];
[person5 release];
// EXC_BAD_ACCESS 访问了不可访问的内存空间
[person5 retain];
// 单个对象的内存管理
Person *person = [[Person alloc]init];
NSString *string = [NSString stringWithFormat:@"hello world"];
person.name = string;
person.age = 21;
NSLog(@"%@",person);
NSLog(@"%ld",[person.name retainCount]);
// [string release];
// NSString *string = @"test";
// 不需要释放,属于常量类型,程序会把这部分数据放到全局变量存储区
// NSString *string1 = [NSString stringWithFormat:@"test"];
// 种类型生成的NSString是autorelease类型的变量,不需要释放,程序一次runLoop结束后就会释放。
// NSString *string2 = [[NSString alloc]initWithFormat:@"test"];
// 这种类型的需要释放,因为alloc过了,需要手动用release释放,
NSLog(@"%p %p",[person name],string);
[person release];
NSLog(@"%ld ",string.retainCount);
person = nil;
}
setter方法的内存管理
- (void)setCar:(Car *)car {
if (car != _car) {
[_car release]; // 第一次为nil release没事
///在setCar 的时候让car的retainCount+1 拿到car的强引用
_car = [car retain];
}
}
- (void)dealloc {
[super dealloc];
// 保证person对象销毁的时候,它所强引用的car也被销毁,防止出现内存泄露
[_car release];
NSLog(@"person is dealloc");
}
循环引用
/*
与@property内存管理有关的参数
retain 生成符合内存管理原则的set方法
assign 直接赋值,不考虑内存管理
nonatomic 不生成多线程相关的代码
readonly 只生成getter方法
readwrite 生成getter和setter方法
@property (nonatomic,assign,setter = isVip:,getter = isVip) BOOL isVip;
*/
@property (nonatomic,retain) Car *car;
// 如果重写了setter和getter方法,property就不会再生成 _car
// 需要自己声明成员变量 _car 在 .h中 或者 在@synthesize 后面
// 如果程序中出现了相互引用问题,那么一端一定要改成弱引用方式
MRC内存管理1
最新推荐文章于 2020-04-12 15:11:32 发布