您的位置:首页 > 其它

关于内存管理的黄金法则

2014-07-03 14:32 267 查看
最近对内存管理,有了一些新的认识,以前只知道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,才行,所以会这么内部实现,保护内存.

所以,说明了我们管理内存,内部也有实现内存的黄金法则.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: