首页 > 代码库 > 关于内存管理的黄金法则

关于内存管理的黄金法则

   最近对内存管理,有了一些新的认识,以前只知道alloc,或者retain,或者copy,之后需要release或者autorelease;

只知其一,但是在工作学习中仅仅知道这些是不够用的,还需要知道属性等内部的内存存管理才行.


@property (readwrite,nonatomic,assign)NSInteger age;

@property (readwrite,nonatomic,copy)NSString * name;

@property (readwrite,nonatomic,retain)NSString * sex;

@property (readwrite,nonatomic,copy)NSString * subject;


在定义属性了之后,需要首先使用dealloc.如下:

- (void)dealloc

{

    [_name release] ,_name = nil;

    [_subject release],_subject =nil;

    [_sex release],_sex =nil;

    [super dealloc];

}

这个时候,我们会问,为啥要写dealloc

以前我真的不知道,后来通过了解内存的黄金管理法则,我总算明白了,主要原因如下:

#import <Foundation/Foundation.h>
#import "Person.h"
int main(int argc, const char * argv[])
{

    Person * zhangsan = [[Person alloc]init];
    [zhangsan setName:@"张三"];
     zhangsan.age=24;
     zhangsan.sex = @"男";
    [zhangsan print];
    
    [zhangsan release];
    return 0;
}

当我们释放了person的对象zhangsan的时候,我们内部赋值使用的属性,还存在内存中,,如果不释放,很有可能会造成内存泄露.所以需要dealloc.

这个时候,我们有点人会想到,属性在实现的时候已经释放了,其实没有实现,具体代码如下:

- (void)setSex:(NSString *)sex
{
    if (_sex != sex) {
        [_sex release];
        _sex =[sex retain];
    }
}

- (NSString *)sex
{
    return [[_sex retain]autorelease];
}


- (void)setName:(NSString *)name
{
    if (_name != name) {
        [_name release];
        _name =[name copy];
        
    }
}

- ( NSString *)name
{
    return [[_name retain]autorelease];
}


- (void)setSubject:(NSString *)subject
{
    if (_subject != subject) {
        [_subject release];
        _subject = [subject copy];
    }
}

- (NSString *)subject
{
    return [[_subject retain]autorelease];
}

这里的release的目的,主要是我们在赋值取值的时候,有可能会多次使用,这个时候
 if (_subject != subject)的意思就是,当前创建的对象,跟之前创建的对象不同,我们就要先释放之前的对象,然后再创建一个对象retain,或者copy,才行,所以会这么内部实现,保护内存.

所以,说明了我们管理内存,内部也有实现内存的黄金法则.