您的位置:首页 > 其它

野指针、内存泄露

2015-07-31 08:54 363 查看
#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: