内存管理

来源:互联网 发布:深圳几米软件 编辑:程序博客网 时间:2024/04/29 04:59
一 内存的介绍.

1.OC管理的内存是堆区.栈区是由系统管理的.
2.栈区 : 变量都在栈区 , 但是static修饰的变量在静态区 , const 修饰的变量在常量区 . 
           int  a = 10 ; 变量a 在栈区,
           Person *p = [[Person alloc] init] ;   指针变量 p 在栈区 , 它所指向的对象(内存)在堆区 . 
3.堆区的内存不能有名字(不能命名) . 

二 局部变量和成员变量的区别

局部变量 : 是在方法内部定义的变量 , 变量名的生命周期是只在方法内部有效 , 也就是说在那个大括号内定义,就在那个大括号内有效 . 
例如 : 
-(void)change
1{
NSString *a = @“hello” ;
    2{
NSString *b ;

    }
for (int i = 0;i < 10; i ++)
3{
     BOOL judge = NO ; 
 }

}
a 的生命周期是最外层的大括号1.
b 的生命周期是大括号2
c 的生命周期是大括号3

成员变量 : 成员变量在整个类内有效 . 只有类释放了成员变量才会释放 . 

三 内存问题(为什么要进行内存管理)

1 野指针问题 : 
 栈区的指针存在,但是堆区的对象(内存)却释放了 .
2 内存泄漏
堆区的存在,但是栈区的指针释放了 . 

四 内存管理原则

 1 . 保证在使用的时间是安全的,保证不使用的时候消失.
 2 . 谁让引用计数 +1 , 谁负责引用计数 -1;
 3 . 类方法的引用计数 : 通过类方法创建的对象是自动释放的.它已经添加到自动释放池中 ;
 4 . 遍历构造器返回的对象是放到自动释放池中的 .  

五 自动释放池

1 创建一个自动释放池(老版本)
NSAutoreleasePool *pool1 = [[NSAutorelease alloc ] init] ;
NSAutoreleasePool *pool = [[NSAutorelease alloc ] init] ;
Car *car = [ [Car alloc] init];
//只有autorelease修饰的对象,才能添加到离这个对象最近的自动释放池中 . 
[car autorelease];   // car 在pool中
[pool release ] ;
[pool1 release];
2 . 新版本
@autoreleasepool{

Car  *car = [ [Car alloc] init ] ;

}

六 . 总结

1 . 如果在类中声明了成员变量,那么成员变量的创建必须在init中且必须保证引用计数为1,并在dealloc中释放.
2 . 如果在类中声明了属性 , 那么对属性赋值的时候必须通过.语法来进行赋值(为了保证引用计数为1且避免内存泄漏)且必须在dealloc中释放.

0 0