内存管理机制简述

2017-04-20  本文已影响0人  公子无礼
原理:
  • 每个对象内部都保存了一个与之相关联的整数,称为引用计数器(auto reference count)
基本原则:

MRC:

  • 内存管理遵循“谁创建,谁释放,谁引用,谁管理”的机制,当通过alloc、new或者(mutable)copy来创建一个对象,必须调用release或autorelease(autorelease是延迟释放内存,不用你自己去手动释放,系统会知道在什么时候该去释放掉它。),当通过retain引用一个对象的时候,需要调用release。当对象引用计数为0时,系统将释放该对象,这是OC的手动管理内存机制。

ARC:

  • iOS 5.0之后引用自动管理机制——自动引用计数,管理机制与手动机制一样,只是不再需要调用retain、release、autorelease;它编译时的特性,当你使用ARC时,在适当位置插入release和autorelease;它引用strong和weak关键字,strong修饰的指针变量指向对象时,当指针指向新值或者指针不复存在,相关联的对象就会自动释放,而weak修饰的指针变量指向对象,当对象的拥有者指向新值或者不存在时weak修饰的指针会自动置为nil。
注意事项:
  • 如果一个对象有一个strong类型的指针指向着,这个对象就不会被释放。如果一个指针指向超出了它的作用域,就会被指向nil。如果一个指针被指向nil,那么它原来指向的对象就被释放了。当一个视图控制器释放时,它内部的全局指针会被指向nil。
MRC内存管理测试:
Student类:
@interface Student : NSObject {  
    int age;  
}  
@property int age;  
@end 

@implementation Student  
@synthesize age;  
//重写dealloc方法,当引用计数器(auto reference count)为零的时候调用。  
- (void)dealloc {  
    NSLog(@"%@被销毁了",self);  
    [super dealloc]; 
}  
@end  

Controller类:
Student *stu = [[Student alloc]init];// alloc一次,引用计数器为1  
// Student *stu = [[[Studnet alloc]init] autorelease];// 这样写的话系统会在适当的地方对stu的内存进行自动回收,就不用自己写release回收了
// z代表无符号  
NSLog(@"count:%zi", [stu retainCount]);  
[stu retain];// 引用计数器变为2  
NSLog(@"count:%zi", [stu retainCount]);  
[stu release];// 引用计数器变为1  
NSLog(@"count:%zi", [stu retainCount]);          
[stu release];// release一次,引用计数器减1,变为0然后会调用dealloc方法

运行结果:
2017-04-20 23:51:51.041 **[93035:36023785] count:1
2017-04-20 23:51:51.041 **[93035:36023785] count:2
2017-04-20 23:51:51.041 **[93035:36023785] count:1
2017-04-20 23:51:51.041 **[93035:36023785] <Student: 0x100109a80>被销毁了

------随笔

上一篇下一篇

猜你喜欢

热点阅读