MRC模式下的内存管理机制
OC的内存管理机制是什么?
答:内存管理的机制:
每个对象都有自己的引用计数器
在MRC内存管理模式下,引用计数器计算机是无法自动操作的。
当向对象发送alloc、copy、new消息的时候,该对象引用计数器会自动设置为1。
向对象发送[对象 retainCount]获得该对象引用计数器的值。
当不在使用对象的时候,会发送release消息,通知引用计数器”减“1.
当一个对象的引用计数器的值为0时,”系统“会自动销毁该对象,并回收该内存空间。
当对象销毁的时候,会自动发送dealloc消息。
声明式属性中是如何解决内存问题的?
答:
默认情况下声明式属性,并没有解决内存问题
如果需要解决内存问题,需要加上(retain)
-(void)setBook:(Book*)book
{
if(nil ==_book)
{
_book =book;
[_book retain];
}else{
[_book release];
_book = book;
[_book retain];
}
}
-(void) dealloc{
[_book release];
[super dealloc];
}
@property (retain) Book* book;
声明式属性解决的只有setter问题,加1操作问题
dealloc中减1操作依然需要自己做
如果一个对象中的声明式属性是对象类型,加上retain
当一个对象销毁的时候,应该将它拥有的属性对象全部release(重写dealloc方法)
getter方法和工厂方法中的内存问题是如何解决的?
答:自动释放池可以帮我们自动释放对象
+(id)EFstudent{
EFStudent* stu = [Student alloc] init] autorelease];
return stu;
}
-(EFStudent*)student{
return [[_student retain] autorelease];
内存的管理,是对堆内存的管理(申请和释放)通过引用计数器来管理,当引用计数器为0时,系统释放那片内存。MRC模式下,内存的管理要遵循谁申请,谁释放的原则,即谁把引用计数器加1,谁负责减1,内存管理不当的后果有,程序崩溃(使用释放的对象)和内存泄露。