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,才行,所以会这么内部实现,保护内存.

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



  • 相关阅读:
    LeetCode----->dp系列
    重读STL源码剖析:vector
    重读深度探索C++对象模型:构造
    LeetCode4:寻找两个有序数组的中位数
    部署测试环境(ubuntu+mysql+tomcat)
    开发环境配置(netbeans+ant迁移到eclipse+maven)
    笔记《Java程序性能优化 让你的Java程序更快、更稳定》 第二章 设计调优
    企业高并发的成熟解决方案(一)video(笔记&知识点)
    猎豹使用AI RoboForm填表
    FreeMarker笔记 第四章 其它
  • 原文地址:https://www.cnblogs.com/jhcelue/p/6901874.html
Copyright © 2011-2022 走看看