http://1qaz2wsx3edc.iteye.com/blog/1523830
objc 内存管理
1. 对象生命周期1) 诞生: new or alloc
2) 生存: 接收消息和执行操作
3) 交友: 借助组合的方法和参数
4) 死去: 被释放
2. 方法
1) –(id) retain;
2) –(void) release;
3) –(unsigned) retainCount;
3. 引用计数
1) 每个对象都有一个与之相关联的整数---引用计数
2) 计数规则为
i. 访问+1 访问结束-1 为0 销毁
ii. 当创建或者copy的时候调用retain为计数器+1
iii. 当销毁当前对象 调用release 为计数器-1
iv. 当计数器为0的时候,objc自动调用dealloc方法,释放全部内存
v. 获取计数器得当前值 retailCount
4. 访问方法的保留和释放(复合时使用)
1) {
Mode mode
}
–(void) setMethod:(Mode *)newMode{
[newMode retain];
[mode release];
}
这个方法针对两种情况
1. mode 和 newMode 不一样。普通的set
现在mode是空的。没有初始化。 所以 mode release 没有影响,而newModw retainCount 是两次,赋给mode(现在是指针) set完后 main方法负责清理一次。 所有调用的对象那还有一次。
2. mode和newMode一样
newMode 先添加一次, 使mode变成了2,然后mode减去一次,变成了1.所以main方法可以释放掉mode
-(void) dealloc{
//释放该对象内所有的内置对象
[super dealloc];
}
5. 需要及时释放的及时释放
1) 比如NSString 在返回的时候 把NSString对象添加到 NSAutoreleasePool 里面
[str autorelease]
6. 因为有了自动释放池 所以 5的情况可以不考虑
1) 最好使用pool release 使用所有版本的mac os系统
7. 在任何时候向一个对象发送autorelease详细,该xuiduixiang都会被添加到自动释放池中。
8. Cocoa内存管理规则
Ps: iphone开发时,如果可以自己release,尽量自己管理
1) 当不再使用一个对象后,必须清理掉或者添加到自动释放池中。
2) 当你得到的对象已经设置成自动释放,则你不需要执行任何操作确保该对象被清理。如果你需要持有该对象一段时间,必须在使用后释放
3) 如果你保留了某个对象,你需要(最后)释放或者自动释放该对象,必须保持retain和release方法使用的次数相等
9. 不是自己 alloc new copy 出来的对象,不需要管理
10. 希望对放在自动释放池中的对象进行持有则需要在使用完后 retain , 在dealloc release掉他。符合内存管理规则中的retain一次必须releas一次。
11. 创建多局部变量
Objective-C程序中可以嵌套创建多个autorelease pool。在需要大量创建局部变量的时候,可以创建内嵌的autorelease pool来及时释放内存。
int main (int argc, const char *argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
int i, j;
for (i = 0; i < 100; i++ )
{
NSAutoreleasePool *loopPool = [[NSAutoreleasePool alloc] init];
for (j = 0; j < 100000; j++ )
[NSString stringWithFormat:@"1234567890"];//产生的对象是autorelease的。
[loopPool release];
}
[pool release];
return (0);
} // main
12. 自动管理机制(用不上)
13. 放在集合里面对象 不用管理 , 集合销毁时对象也被销毁。