A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 谁想去飞 中级黑马   /  2014-12-11 23:03  /  948 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文


1.方法的基本使用
1> retain :计数器+1,会返回对象本身
2> release : 计数器 -1,没有返回值
3> retainCount : 获取当前的计数器
4> dealloc :
当前一个对象要被回收的时候,就会调用;
一定要调用[super dealloc],这句调用要放在最后面;
2.一些概念
1> 僵尸对象 : 所占用内存已经被回收的对象,僵尸对象不能再使用
2> 野指针 : 指向僵尸对象(不可用内存)的指针,给野指针发送消息报错(EXC_BAD_ACCESS)
3> 空指针 : 没有指向任何东西的指针(存储的东西是nil、NULL、0),给空指针发送消息不会报错
例:单个对象的内存管理,假设已经定义了Person类
  • int main()  
    {  
        //通过初始化后 计数器为1  
        Person *p = [[Person alloc] init];  

        //retain 方法返回的是对象本身  
        //计数器为2  
        [p retain];  
        //计数器-1变为1   
      [p release];  
        //计数器-1变为0  
        [p release];     
        return 0;  
    }  

例: 多个对象的内存管理
首先定义两个类
(1)Book
  • @interface Book : NSSObject  
    {  
        int _price;  
    }  

    - (void)setPrice:(int)price;  
    - (int)price;  
    @end  

    @implementation Book  
    {  
        - (void)setPrice:(int)price  
        {  
            _price = price;  
        }  

        - (int)price  
        {  
            return _price;  
        }  
        - (void)dealloc  
        {  
            NSLog(@"Book对象被回收");  
            [super dealloc];  
        }  
    }  

(2) Person
  • @interface Person : NSObject  
    {  
        Book *_book;  
    }  

    - (void)setBook:(Book *)book;  
    - (Book *)book;  
    @end  

    @implementation Person  
    {  
        - (void)setBook:(Book *)book  
        {  
            _book = [book retain];  
        }  
        - (Book *)book  
        {  
            return _book;  
        }  

        - (void)dealloc  
        {  
            //当Person对象被回收时,要保证该对象包含的书也被回收  
            [_book release];  
            NSLog(@"Person对象被回收");  
            [super dealloc];  
        }  
    }  

(3)测试调用代码
int main()  
{  
    //b 的计数器为1  
  •     Book *b = [[Book alloc] init];  

        //p1 的计数器为1  

        Person *p1 = [[Person alloc] init];  

        //p1 想占用b这本身   

        //b 的计数器为2  

        [p1 setBook:b];  


        //b 的计数器为1,Book对象的内存空间没有被释放  

        [b release];  

        b = nil;  

        //p1 的计数器为0,b 的计数器为 0  

       //Person对像的内存空间释放,Book的内存空间也会释放  

        [p1 release];  

        p1 = nil;  


        return 0;  

    }  




1 个回复

倒序浏览
昨天刚看完这个视频,总结的挺好
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马