众所周知ios的内存管理是通过retainCount(引用计数器)来管理的,当retainCount为零时就会将对象销毁。alloc retain 都会让retainCount 加一,release 则会使retainCount减一,autorelease则在对象被加入的那个自动释放池被销毁的时候retainCount也会减一。
本人也是新手,这里用博客记录下我遇到的ios内存的问题:
1用retain属性声明一个变量然后用set方法初始化造成内存泄露:
.h中我们声明了:
@property(nonatomic, retanin) ClassName *name;
.m中我们使用:
@sysnthesize name;
- (void)dealloc{
self.name = nil;// 建议使用
[_name release]; //如果 有name = _name;
[self.name release];//不推荐使用
}
在给他初始化的时候:self.name = [[ClassName alloc] init];在这里我们把等号右边的创建的对象命名为A方便讲述, 在这个初始化的语句中我们使用set方法将 A retain了一次那现在 A 的retainCount 为2,当dealloc调用时name release后A的计数器减一。但此时A的计数器还是为1所以这里A就没被释放造成了内存泄露。为什么呢?
因为系统的set方法是:
- (void)setName:(ClassName*)sName{
[name release];
name = [sName retain];//这里使A的计数器加一了
}
解决这种问题的方法有多种:1 self.name = [[[ClassName alloc] init] autorelease];让等号右边加入自动释放池。 2 不适用set方法 _name = [[ClassName alloc] init]; 这样就不会使A的count加一了。我们前万要记住如果是使用 assign 或者copy的关键使用时要小心。