Object-C内存管理中的黄金法则

来源:互联网 发布:程序员简历工作业绩 编辑:程序博客网 时间:2024/06/09 20:58

在Object-C中,内存的管理是通过retain和release来对对象的计数器进行加1或者减1来进行管理,当使用一个对象

的时候需要进行对对象的计数器加1,使用完成后要减1进行释放,当计数器等于0的时候对象进行销毁。内存管理的黄

金法则就是,当你对一个对象使用retain的时候,一定要进行relase释放。下面我们使用一个例子来说明这个问题,这个

例子是讲遛狗原理,一个人遛狗的时候需要讲自己的绳子套在狗的脖子上面,其他人想遛狗的时候也得把绳子套到狗的

脖子上面,然后如果不想遛狗了就需要把自己的绳子从狗的身上拿掉,也就是减1,当没有人遛狗的时候,这个狗就进

行销毁。

首先看狗这个类

#import <Foundation/Foundation.h>@interface Dog : NSObject{    int _ID;}@property int ID;@end

#import "Dog.h"@implementation Dog@synthesize ID = _ID;- (void) dealloc{    NSLog(@"Dog %d is dealloc",_ID);    [super dealloc];}@end

然后是人这个类

#import <Foundation/Foundation.h>#import "Dog.h"@interface Person : NSObject{    Dog *_dog;}- (void) setDog: (Dog *)aDog;- (Dog*) dog;@end

#import "Person.h"@implementation Person- (void) dealloc{    NSLog(@"person is dealloc");    //把这个人所拥有的狗给释放掉    [_dog release];    [super dealloc];}- (void) setDog: (Dog *)aDog{    if(aDog != _dog){        [_dog release];                _dog = aDog;        [_dog retain];//这里让dog计数器加1    }}- (Dog*) dog{    return _dog;}@end

最后是Main函数使用

#import <Foundation/Foundation.h>#import "Dog.h"#import "Person.h"int main(int argc, const char * argv[]){    @autoreleasepool {        Dog *dog1 = [[Dog alloc] init];        [dog1 setID:1];                Person *xiaoLi = [[Person alloc] init];        //小丽要遛狗        [ xiaoLi setDog:dog1];                Person *xiaoWang = [[Person alloc] init];        //小王要遛狗        [xiaoWang setDog:dog1];                NSLog(@"dog1 retainCount is %ld",[dog1 retainCount]);                [dog1 release];        NSLog(@"dog1 retainCount is %ld",[dog1 retainCount]);                [xiaoWang release];        NSLog(@"dog1 retainCount is %ld",[dog1 retainCount]);                [xiaoLi release];    }    return 0;}

从这里可以看出对于这个内存的分配与释放是如何遵循的,估计以后写代码的时候很多情况下需要画一个图或者好好

想象才能下笔,否则的话很容易出现内存泄露这种事情的发生。

原创粉丝点击