#import <Foundation/Foundation.h>
// 1 野指针 提早释放和反复释放
// 2 内存泄漏
//内存管理原则(配对原则):只要涌现了 new,alloc,retain,copy,就必定配对涌现一个release,autorelease
#import "Person.h"
void test()
{
// 1 内存泄漏的第一种情形
// //1
// Person * p = [[Person alloc] init];
// NSLog(@"%lu",p.retainCount);
// //2
// [p retain];
// //3
// Person * q = [p retain];
// //2
// [p release];
// //1
// [q release];
// // 对象的 retainCount != 0 的时候不会调用 dealloc 函数烧毁对象,对象会一直存在内存中造成内存泄漏
// 2 内存泄漏的第二种情形
Person * p = [[Person alloc] init];
NSLog(@"%lu",p.retainCount);
p = nil;
//
// [p release]; //[nil release]
NSLog(@"%lu",p.retainCount);
}
void test2()
{
// 2 野指针 操作和避免
Person * p = [[Person alloc] init];
NSLog(@"%lu",p.retainCount);
Person * q = [p retain];
[p release];
p = nil;
// 程序拜访了不可拜访的内存空间
// 在指针 release 以后将指针置为 nil;
[q release];
q = nil;
[q run];//[nil run]
}
int main(int argc, const char * argv[]) {
@autoreleasepool {
Person * p = [[Person alloc] init];
NSLog(@"%lu",p.retainCount);
[p release];
// 在一个对象调用 dealloc 函数烧毁以后是不会起逝世复生的
// EXC_BAD_ACCESS 拜访了不可拜访的内存空间
//[p retain];
}
return 0;
}
#import <Foundation/Foundation.h>
// 1 野指针 提早释放和反复