zoukankan      html  css  js  c++  java
  • 关于内存管理的黄金法则

       近期对内存管理,有了一些新的认识,曾经仅仅知道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,才行,所以会这么内部实现,保护内存.

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



  • 相关阅读:
    Latex (1)
    linux/unix command
    函数类型和函数指针类型(摘自 linux c编程一站式学习)
    emacs 剪切板
    Centos 常见问题汇总
    makefile(摘自linux_c编程一站式学习)
    [转]DIV布局之三行三列之高度自适应
    ASP.Net新手项目经验谈
    获取中文首字母的方法
    还是不会伪装
  • 原文地址:https://www.cnblogs.com/jhcelue/p/6901874.html
Copyright © 2011-2022 走看看