好久没写过需要自己内存管理的语言了,还挺不习惯的。
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