内存管理--简单整理

课堂笔记:
  • 只有OC对象才需要进行内存管理的本质原因是OC对象存放在堆里面,非OC对象一般放在栈里面(栈内存会被系统自动回收)
  • 当使用alloc、new或者copy创建一个对象时,对象的引用计数器默认就是1
  • 僵尸对象:已经被销毁的对象(不能再使用的对象)
  • 野指针:指向僵尸对象(坏内存)的指针,给野指针发消息会报EXC_BAD_ACCESS错误
  • 空指针:没有指向储存空间的指针(里面存的是nil,也就是0),给空指针发消息是没有任何反应的
  • 为了避免野指针错误的常见方法:在对象被销毁之后,将指向对象的指针变为空指针
  • 一旦重写dealloc方法,就必须调用[super dealloc],并且必须放在最后面调用
引用计数器的常见操作
  1. 给对象发送一条retain消息,可以使引用计数器值+1(retain方法返回对象本身)
  2. 给对象发送一条release消息,可以使引用计数器值-1
  3. 给对象发送retainCount消息,可以获得当前的引用计数器值
    注意:release并不代表销毁/回收对象,仅仅是引用计数器-1
  • 要想手动调用retain、release等方法,就必须关闭ARC功能 在build Setting下搜索automatic r就可以


    手动管理内存
  • 默认情况下,Xcode是不会管僵尸对象的,使用一块被释放的内存也不会报错,为了方便调试,应该开启僵尸对象监控


    僵尸对象监控

@property参数
  • 控制set方法的内存管理
    1.retain:release旧值,retain新值(OC对象)
    2.assign:直接赋值,不做任何内存处理(默认,用于非OC对象类型)
    3.copy:release旧值,copy新值(一般用于NSString *)
  • 控制需不需生成set方法
    1.readwrite:同时生成set方法和get方法(默认)
    2.readonly:只会生成get方法
  • 多线程管理
    1.atomic:性能低(默认)
    2.nonatomic:性能高

set方法的内存管理
-(void)setCar:(NSString *)car
{
  if (car != _car) {
    //对当前正在使用的车(旧车)做一次release
    [_car release];
   
    //对新车做一次retain操作
    _car = [car retain];
  }
}```
***
@class和#import的区别
- 作用上的区别:#import会包含引用类的所有信息(内容),包括引用类的变量和方法。@class仅仅是告诉编译器有这么一个类,具体这个类里面有什么信息,完全不知
- 效率上的区别:如果有上百个头文件都#import了用一个文件,或者这些文件依次被#import,那么一旦最开始的头文件稍有改动,后面引用到这个文件的所有类都需要重新编译一遍,编译效率非常低。相对来说,使用@class方式就不会出现这个问题了
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 内存管理的原理? 内存空间总共有8块区域,有两个区域需要特别注意,一个就是堆空间,一个就是栈空间。栈里存放临时变量...
    Carden阅读 3,352评论 0 1
  • iOS内存管理 概述 什么是内存管理 应用程序内存管理是在程序运行时分配内存(比如创建一个对象,会增加内存占用)与...
    蚊香酱阅读 11,017评论 8 119
  • 内存管理 简述OC中内存管理机制。与retain配对使用的方法是dealloc还是release,为什么?需要与a...
    丶逐渐阅读 6,104评论 1 16
  • 29.理解引用计数 Objective-C语言使用引用计数来管理内存,也就是说,每个对象都有个可以递增或递减的计数...
    Code_Ninja阅读 5,542评论 1 3
  • 我们生活在一个充满焦虑的社会中,如何去缓解自己的焦虑,使自己安心,有一个方法,叫斯多葛控制二分法,我在《使你安心的...
    阿润的清源塘阅读 4,702评论 0 1

友情链接更多精彩内容