OC系列高级-内存管理二

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OC系列高级-内存管理二相关的知识,希望对你有一定的参考价值。

一.MRC模式下set和get方法

首先我们创建一个Dog类

Dog.h:

#import <Foundation/Foundation.h>

@interface Dog : NSObject
@property (assign) int ID;
@end

Dog.m:

#import "Dog.h"

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

@end

再创建一饿Person类

Person.h:

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

Person.m:

#import "Person.h"

@implementation Person

-(void)setDog:(Dog *)newDog{
    NSLog(@"%d",_dog.retainCount);
    if(_dog != newDog){
        [_dog release];
        _dog = nil;
        NSLog(@"%d",_dog.retainCount);
        _dog = [newDog retain];
        NSLog(@"%d",_dog.retainCount);
    }
}

-(Dog *)dog{
    return [_dog autorelease];
}

- (void)dealloc
{
    NSLog(@"Person is death");
    [super dealloc];
}

@end

在main函数中我们创建两个dog,并且创建person

        Dog *dog1 = [[Dog alloc]init];
        dog1.ID = 1;
        Dog *dog2 = [[Dog alloc]init];
        dog2.ID = 2;
        
        Person *p = [[Person alloc]init];

person set一个dog

   [p setDog:dog1];

此时,set方法完之后dog.retainCount值为2,因为dog创建和retain

当我们把dog1 release操作

        [dog1 release];
        NSLog(@"%d",dog1.retainCount);  //值为1
NSLog(@"%zd",p.retainCount);  //person的retainCount值为1,因为只是创建

我们把person release操作

        [p release];
        p = nil;

此时person retainCount值为0,并且调用了dealloc方法,但是person里的dog的retainCount值为1;所以我们在回收person时要把它的对象属性release操作,要不会引起内存空间的泄漏

当person没有执行release操作,再set一个dog1操作,此时,person的dog的retainCount值为1,即没有进行retain操作

注意点:

1.析构函数的release时一定要release掉包含的对象

以上是关于OC系列高级-内存管理二的主要内容,如果未能解决你的问题,请参考以下文章

OC系列高级-内存管理二

OC - 浅谈内存管理

oc知识点 内存高级

OC系列高级-类与协议

OC系列高级-代理

OC系列高级-NSValue