在Object-C中,内存的管理是通过retain和release来对对象的计数器进行加1或者减1来进行管理,当使用一个对象
的时候需要进行对对象的计数器加1,使用完成后要减1进行释放,当计数器等于0的时候对象进行销毁。内存管理的黄
金法则就是,当你对一个对象使用retain的时候,一定要进行relase释放。下面我们使用一个例子来说明这个问题,这个
例子是讲遛狗原理,一个人遛狗的时候需要讲自己的绳子套在狗的脖子上面,其他人想遛狗的时候也得把绳子套到狗的
脖子上面,然后如果不想遛狗了就需要把自己的绳子从狗的身上拿掉,也就是减1,当没有人遛狗的时候,这个狗就进
行销毁。
首先看狗这个类
- #import
-
- @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
- #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
- #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;
- }
从这里可以看出对于这个内存的分配与释放是如何遵循的,估计以后写代码的时候很多情况下需要画一个图或者好好想象才能下笔,否则的话很容易出现内存泄露这种事情的发生。原文
阅读(789) | 评论(0) | 转发(0) |