• 豪门国际博彩: 浅谈Objective-C内存管理(上)

    2 十一 2015 豪门国际娱乐城线上赌博 29 次 0

    浅谈Objective-C内存管理(上)豪门国际娱乐城网址 作者
    2015.08.11 20:01*
    写了15284字,被21人关注,获得了21个喜欢

    HELLO 我是(@孙占兴) 欢迎来到我的窝: 转载请标明原文地址 ^_^
    今天说一下Objective-C中的内存管理,也是相当重要的知识,面试和工作都会涉及到。关于内存管理将会用三篇文章介绍,本站多数文章通俗易懂,如有错误请及时评论,抱着相互学习的心态来写。
    本文是我的 浅谈Objective-C内存管理 笔记中的一篇,涉及相关的有:

    首先先回忆下,上篇博文介绍的堆和栈。
    例:

    int main(int argc, const char * argv[])
     int temp = 10; 
     Car *bus = [[Car alloc]init];
     return 0;
    }

    问:在上面的代码中,内存是怎么样分配的?分配几块内存?
    答:共分配3块内存空间,分配情况如图:

    alt

    好了,回顾结束,下面开始介绍内存管理。(首先关闭Xcode中的Automatic Referencing Counting)
    问:什么是内存?
    答:程序运行时在计算机内存中进行资源的分配和使用,因此内存的性能对计算机的影响非常大。
    问:为什么要管理内存?
    答:提高程序效率,在合理的时刻分配和回收内存。

    引用计数器-retainCount、retain、release、野指针、空指针

    retainCount:当使用alloc、new、copy(目前不会用2333)时,对象引用记数器加1,获取当前计数器的次数。
    - (void)dealloc;:当计数器为0时,系统会自动调用回收方法。 注:在- (void)dealloc;中,[super dealloc];要放在最后面。

    retain:对象计数器+1(返回值是对象本身)

    release:对象计数器-1
    直接看代码:

    Car.h
    @interface Car : NSObject

    - (void) dealloc;
    @end

    Car.m

    @implementation Car
    - (void) dealloc
     NSLog(@"Car对象被自动回收");
     [super dealloc];
    }

    main.m

    int main(int argc, const char * argv[])
     Car *bus = [[Car alloc]init]; 
     [bus retain]; 
     NSUInteger number = [bus retainCount]; 
     NSLog(@"计数器:%ld",number); 
     [bus release]; 
     [bus release]; 
     return 0;
    }

    运行结果需要手动得知~

    野指针:指向不可用对象的地址
    首先逐行分析代码在内存中的情况:
    Car *bus = [[Car alloc]init];过后Car对象的计数器变成1: [图片上传中。。。(2)][bus retain];过后Car对象通过retain计数器从上图的1变成2。NSUInteger number = [bus retainCount];NSLog(@"计数器:%ld",number);获取Car对象计数器,赋值给NSUInteger类型number变量,并且打印。[bus release];、[bus release];分别将对象计数器-1,此时对象计数器为0。

    那么问题来了,此时如果在这两句后面加上一句[bus release];
    ,会有什么结果?其实当前面的两个[bus release];过后,Car对象在堆内存中已经销毁,所以当再次使用[bus release];时,bus指针在发送消息release时指向的事Car对象的地址,但Car对象已经是僵尸对象。所以会出错,此时应该使用空指针,将bus指向的地址清空bus = nil;。所以你在后面在加上多少个[bus release];也不会有问题,但会警告。

    可能有的朋友会想,那我在两个[bus release];后面加上一句[bus retain];,让bus指向的Car对象计数器变成1不久好了吗?但是你想,你在前面的两个代码中已经将Car对象变成僵尸对象,当你在使用[bus retain];时,bus指向的地址被销毁,无法发送消息,因此不能使用。

    引用计数器-多对象内存管理

    多对象内存管理顾名思义:多个对象相互联系,存在一定的关系。例如:小黄想开Car车这辆车,小红也想开Car车这辆车。换成内存管理多角度来看,此时Car对象的计数器为2。说起了开车,我就拿我喜欢的游戏-跑跑卡丁车,来举一下例子。[图片上传中。。。(3)]这里要设计两个对象,玩家Person对象和房间Home对象。贴一下代码:

    Home对象
    Home.h

    @interface Home : NSObject
     int _number;
    - (void)setNumber:(int)number;
    - (int)number;
    @end

    Home.m

    @implementation Home
    - (void)setNumber:(int)number
     _number = number;
     - (int)number
     return _number;
    - (void)dealloc
     NSLog(@"home对象被释放");
     [super dealloc];
    @end

    Person对象

    person.h
    @interface Person : NSObject
     Home *_home;
    - (void)setHome:(Home *)home;
    - (Home *)home;
    @end

    person.m

    @implementation Person
    - (void)setHome:(Home *)home
     _home = home;
     - (Home *)home
     return _home;
    - (void)dealloc
     [_home release];
     NSLog(@"Person对象被释放");
     [super dealloc];
    @end

    main.m

    int main(int argc, const char * argv[])
     Home *home = [[Home alloc] init];
     Person *person = [[Person alloc] init];
     [person setHome:home]; [home release]; 
     home = NULL; 
     [person release];
     person = NULL; 
     return 0;
     }

    代码在内存中的反应: [图片上传中。。。(4)]
    当我创建了一个房间对象Home时,Home对象自身的计数器将会+1,同样创建Person对象,自身计数器也会+1。代码如下:Home home = [[Home alloc] init]; Person person = [[Person alloc] init];

    但是这个房间要有房主对吧?要有使用的人,所以我让Person对象中存在一个Home类型的成员变量 home来去指向Home对象。并把home传递给 home。 [person setHome:home];,此- (void)setHome:(Home *)homeHome

    方法,对象计数器应该为2。但其实还是为1,因为你没有让Home对象+1,所以要在setHome代码中修改,如下:- (void)setHome:(Home *)home{ _home = [home retain];}也就是说将home所指向动对象计数器+1(之前说过retain返回的是对象),。

    略过后面几行代码,当[person release];代码过后,因之前声明了Person的dealloc方法,所以系统将自动调用dealloc方法,将会执行[_home release];,Home对象计数器将-1,为0,同时调用Home对象的dealloc

    方法此处程序运行结果需要自己获取。


    想上首页热门榜么?好内容想被更多人看到么?来投稿吧!如果被拒也不要灰心哦~入选文章会进一个队...

    · 44825人关注

    豪门国际娱乐城网址

    Categories:豪门国际博彩

    标签:

    上一篇: 下一篇:

Baidu