#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;
}
野指针、内存泄露
最新推荐文章于 2024-07-28 09:19:43 发布