1957

无聊蛋疼的1957写的低端博客
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Objecive-C 内存管理

Posted on 2012-05-29 00:51  1957  阅读(304)  评论(0编辑  收藏  举报

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

 

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;