OC - 内存管理

/* 内存管理:

        

    1.管理内存的原因: 移动设备内存有限,App占用的内存也有限,我们在内存使用过程中需要回收一些不再使用的内存;

    2.内存管理的范围: 任何继承NSObject的对象,对其他基本数据类型无效 ; -> 


<span style="font-size:24px;">people *p = [People alloc]init];</span>

   

  1)局部变量存储 在栈中, 对象存储在

     局部变量:只是在方法内部定义的变量叫作局部变量(变量名的生命周期)

   2)栈区的内存由系统进行管理和释放,我们只需要管理堆区的内存就可以

   

   3) 栈释放,堆未释放->内存泄露

      栈存在,堆释放->野指针


    3. 管理机制:引用计数

   

    4. 内存管理的原则:

   

     1) 保证在使用的时候安全,保证在不使用的时候消失

     2)谁负责引用计数+1,谁就要负责引用计数-1

     3) 通过类方法创建的对象,是自动释放的,它已经添加到了自动释放池

    5.关于 retain, alloc, autorelease copy;

   

   

     1).alloc 代表创建一个引用计数为1的对象

     2).retain 使得引用计数加1

   

   :引用计数的打印

     NSArray *arr = [NSArray array];

     NSLog(@"%d",arr.retainCount);

   

   3). 自动释放池: 内存延迟释放

      dkop创建一个自动释放池(老写法)

      

<span style="font-size:24px;">NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];
   
       Car *c = [[Car alloc]init];
      [c autorelease];        // 修饰的这句话判断距离(创建池到修饰的距离->由上到下)
                            // 只有autorelease修饰的对象会添加到自动释放池;     
      [pool release];</span>


   6. 关于重写set,get 方法

     :只要调用了alloc,就必须有release(autorelease)

    1)set方法

      1. 基本数据类型,直接复制

   -(void)setAge:(int)age

   {

      _age = age;

   

   }

   

     2. OC对象类型

  

  -(void)setCar:(Car *)car
   {
     (1) 先判断是不是原先传进来的对象
           if(_array == array)

      {
     (2) 对旧对象进行一次release

         [_array release];
     (3) 对新对象进行一次retain

         _array = [array retain];
      }
   }

   

   2)get方法

   

   

-(NSArray *)getCAr:(Car *)car
   {
     [_array retain];
   
     return [ array autorelease];
   }
   

   3.属性 @property的参数

   

   1)内存管理相关参数

   

   Retain:对对象release旧值,retain新值(适用于OC对象类型)

   

   Assign:直接赋值(默认,适用于非oc对象类型)

   

   Copy:release旧值,copy新值

   

   

   

   2)是否要生成set方法(若为只读属性,则不生成)

   

   Readonly:只读,只会生成getter的声明和实现

   

   Readwrite:默认的,同时生成settergetter的声明和实现

   

   3)多线程管理(苹果在一定程度上屏蔽了多线程操作)

   

      Nonatomic:高性能,一般使用这个

   

      Atomic:低性能

   

 7. 关于内存管理中的循环引用问题

   

   @class 类名;——解决循环引用问题,提高性能

   

   @class Student

   :

    声明可能有这么一个类,但不知道这个类是否存在

    以后在.h 里引用必须使用@class; .m文件里直接使用 #import 引用

   

   1@class的作用:声明一个类,告诉编译器某个名称是一个类

   

   2)开发中引用一个类的规范

   

   1)在.h文件中使用@class来声明类

   

   2)在.m文件中真正要使用到的时候,使用#import来包含类中的所有东西

   

   3)两端循环引用的解决方法

   

   一端使用retain,一端使用assign(使用assign的在dealloc中也不用再release

   

   

   


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值