OC手动内存管理注意事项

 创建对象
 1.分配内存空间,存储对象
 2.初始化成员变量
 3.反回对象的指针地址
 
 1.对象在完成创建的同时,内部会自动创建一个引用计数器,这个计数器,是系统用来判断是否回收对象的唯一依据,当我们的引用计数retainCount = 0的时候,系统会毫不犹豫回收当前对象
 2.[对象 release]  reatinCount - 1
 3.[对象 retain]   reatinCount + 1 ,返回self
 4.我们的引用计数retainCount = 0的 对象就被销毁了
 
/5.dealloc函数,当一个对象要被销毁的时候,系统会自动调用dealloc函数,通知对象你将要被销毁
 

 内存管理原则(配对原则):只要出现了 new,alloc,retain,就一定配对出现一个release,autorelease


手动内存管理研究问题方法
1.野指针操作
2.内存泄漏

void test()
{
    //retainCount = 1
    Person * p = [[Person alloc] init];
    
    p.age = 10;
    NSLog(@"%@",p);
    
    //retainCount = 0
    //系统已经将p所指向的对象回收了
    //EXC_BAD_ACCESS 访问了不可访问的内存空间
    //被系统回收的对象我们称之为僵尸对象
    //默认情况下xcode为了提高编码效率,不会时时检查僵尸对象
    
    [p release];
    
    //        NSLog(@"p所指向的对象回收了 %@",p);
    //        p.age = 20;//[p setAge:20];
    [p run];
 
}

void test2()
{
    Person * p = [[Person alloc] init];
    p.age = 20;
    
    NSLog(@"%@",p);
    
    [p release];
    //如果你确定当前作用于中的对象已经不会再被使用了,为了防止野指针操作,通常我们会把不在使用的指针变量赋值为nil
    p = nil;
    
    p.age = 30;//[nil setAge:30];
    [p run]; //[nil run];
    //避免野指针操作的方法 [nil resele]

}
void test3()
{
    /*
     //内存泄漏第一种情况
     //1
     Person * p = [[Person alloc] init];
     
     p.age = 20;
     NSLog(@"%@",p);
     //2
     [p retain];
     
     //3
     [p retain];
     
     //2
     [p release];
     
     //只要对象的retainCount != 0 就会一直存在在内存中
     //内存泄漏指的就是,不再被使用的对象,一直在内存中没有被销毁
     */
    
    /*
     //内存泄漏第二种情况
     //retainCount = 1
     Person * p = [[Person alloc] init];
     p.age = 20;
     [p run];
     
     
     p = nil;
     
     
     [p release];//[nil release];
     */
    
    //1
    Person * p = [[Person alloc] init];
    
    p.age = 20;
    [p run];
    
    Person * p1 = p;
    
    //0
    //        [p release];
    [p1 release];
    
    //野指针操作
    p1.age = 20;

}
void test4()
{
    //1
    Person * p = [[Person alloc] init];
    
    p.age = 20;
    NSLog(@"%@",p);
    
    //0
    [p release];
    
    //野指针操作,当一个对象retainCount已经为0 时,调用retain方法,是不会使得对象起死回生的,同时还会发生野指针操作异常
    [p retain];
}

void test5(Person * p)
{
    p.age = 30;// release retain
    [p retain]; //2
//    [p release];
    NSLog(@"%@",p);
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值