野指针、内存泄露

#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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值