Chinaunix首页 | 论坛 | 博客
  • 博客访问: 828394
  • 博文数量: 190
  • 博客积分: 2991
  • 博客等级: 少校
  • 技术积分: 2400
  • 用 户 组: 普通用户
  • 注册时间: 2012-09-24 18:11
文章分类

全部博文(190)

文章存档

2015年(3)

2014年(1)

2013年(65)

2012年(121)

我的朋友

分类: C/C++

2012-10-15 07:17:00

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

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

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

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

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

行销毁。

首先看狗这个类

  1. #import   
  2.   
  3. @interface Dog : NSObject  
  4. {  
  5.     int _ID;  
  6. }  
  7.   
  8. @property int ID;  
  9. @end  

  1. #import "Dog.h"  
  2.   
  3. @implementation Dog  
  4.   
  5. @synthesize ID = _ID;  
  6.   
  7. - (void) dealloc  
  8. {  
  9.     NSLog(@"Dog %d is dealloc",_ID);  
  10.     [super dealloc];  
  11. }  
  12.   
  13. @end  

然后是人这个类

  1. #import   
  2. #import "Dog.h"  
  3.   
  4. @interface Person : NSObject  
  5. {  
  6.     Dog *_dog;  
  7. }  
  8.   
  9. - (void) setDog: (Dog *)aDog;  
  10.   
  11. - (Dog*) dog;  
  12.   
  13. @end  

  1. #import "Person.h"  
  2.   
  3. @implementation Person  
  4.   
  5. - (void) dealloc  
  6. {  
  7.     NSLog(@"person is dealloc");  
  8.     //把这个人所拥有的狗给释放掉  
  9.     [_dog release];  
  10.     [super dealloc];  
  11. }  
  12.   
  13.   
  14. - (void) setDog: (Dog *)aDog  
  15. {  
  16.     if(aDog != _dog){  
  17.         [_dog release];  
  18.           
  19.         _dog = aDog;  
  20.         [_dog retain];//这里让dog计数器加1  
  21.     }  
  22. }  
  23.   
  24. - (Dog*) dog  
  25. {  
  26.     return _dog;  
  27. }  
  28.   
  29. @end  

最后是Main函数使用

  1. #import   
  2. #import "Dog.h"  
  3. #import "Person.h"  
  4.   
  5. int main(int argc, const char * argv[])  
  6. {  
  7.   
  8.     @autoreleasepool {  
  9.         Dog *dog1 = [[Dog alloc] init];  
  10.         [dog1 setID:1];  
  11.           
  12.         Person *xiaoLi = [[Person alloc] init];  
  13.         //小丽要遛狗  
  14.         [ xiaoLi setDog:dog1];  
  15.           
  16.         Person *xiaoWang = [[Person alloc] init];  
  17.         //小王要遛狗  
  18.         [xiaoWang setDog:dog1];  
  19.           
  20.         NSLog(@"dog1 retainCount is %ld",[dog1 retainCount]);  
  21.           
  22.         [dog1 release];  
  23.         NSLog(@"dog1 retainCount is %ld",[dog1 retainCount]);  
  24.           
  25.         [xiaoWang release];  
  26.         NSLog(@"dog1 retainCount is %ld",[dog1 retainCount]);  
  27.           
  28.         [xiaoLi release];  
  29.     }  
  30.     return 0;  
  31. }  

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

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

阅读(749) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~