zoukankan      html  css  js  c++  java
  • ObjeciveC 内存管理

    好久没写过需要自己内存管理的语言了,还挺不习惯的。

    objective-c使用的是retain计数

    - (id) retain
    {
        retainCount++;
        return self;
    }
    - (void) release
    {
        retainCount--;
        if (retainCount == 0)
            [self dealloc];
    }
    

    简单的说就是上面这样实现。

    但是会有些问题,就是一个对象创建和销毁并不在一起,会出现一些问题。

    所以这里就要使用autorelease了

    autorelease实现原理就是每隔一段时间就会对实例进行“排干(drain)”,autorealease的对象有两种命运:要么走完生命周期,直到被释放,要么被另外一个对象保留。

    return [newPossession autorelease];

    之前提到的setter,getter都是有问题的

    - (void)setPossessionName:(NSString *)str
    {
        possessionName = str;
    }
    

     这样写有两个问题

    1、str在外面释放,那么这里的possessionName将会悲剧

    2、如果possessionName本来指向的一个对象,这里更新,那么那个对象没有释放,所以产生内存泄露

    所以该这么写

    - (void)setPossessionName:(NSString *)str
    {
        [str retain];
        [possessionName release];
        possessionName = str;
    }
    

     这样无论str在外面怎么释放保证了retrainCount>0,直到在这里被释放。

    还有覆盖dealloc的时候记得要调用父类的dealloc

    [super dealloc];

    上面一个setter都那么麻烦,当然有简单的办法,那就是用property

    @property NSString *possessionName;
    

     有三类属性

    原子性:atomic,nonatomic,默认atomic

    可写性:readwrite(默认),产生对应的存取方法,readonly只产生取方法

    内存管理:assgin(默认),retain,copy

    @property (nonatomic,retain) NSString * possessionName;
    

    最后在.m里面写

    @SYthesize
    @implementation Possesion
    @sythesize possessionName;
    
    by 1957
  • 相关阅读:
    HBase HTablePool
    Hadoop MapReduce InputFormat/OutputFormat
    MapReduce执行过程源码分析(一)——Job任务的提交
    HBase MultiVersionConsistencyControl
    HBase Split
    HBase HFile
    Do not to test a private method.
    HTML5使用ApplicationCache
    Swift使用FMDB操作SQLite
    使用Swift操作NSDate类型基础
  • 原文地址:https://www.cnblogs.com/x1957/p/2522882.html
Copyright © 2011-2022 走看看