1、MRC情况下,一个alloc对应一个release或autorelease

  · 用自定义方法创建对象在最后面加 autorelease ,即alloc创建的对象必须要释放;

  · 系统内部的便利构造器后面自动添加有autorelease,所以遍历构造器创建的对象不用加,不然会造成过度释放,产生野指针。

2、容器的内存管理

  ①. 容器加入一个对象是会被执行一次retain操作,引用计数加 1 ,容器内部的每个对象的应用计数是一样的;

  ②. 同理,容器移除一个对象时会执行一次release 操作,引用计数减 1;

  ③. 同样的,在容器释放时,会对容器内所有对象发送一次release消息。

3、属性的setter方法会造成实例变量的内存泄露,可以全部放到dealloc方法重写时执行一次release操作。

4、KVC 键值编码方式,间接访问实例变量,为实例变量赋值和取值

  赋值方法  setValue:@"值" forKey:@"键"

  取值方法  对象 valueForKey:"键"

  通过路径给实例变量赋值的方法  setValue:"值"  forKeyPath:"对象.实例变量(即实例变量的路径)"

  通过路径获取实例变量的值的方法  对象 valueForKeyPath:"对象.实例变量(即实例变量的路径)"

  setvalue: forkey: 方法的执行步骤 (假如key是name)

// 1、去类里面找是否有一个方法叫 setName: ,有的话赋值,没有的话执行第二步

// 2、去类里面找是否有一个实例变量叫 _name ,有的话赋值,没有的话执行第三步

// 3、去类里面找是否有一个实例变量叫 name ,有的话赋值,没有的话执行第四步

// 4、查找当前类是否实现了 setvalue:forUndefindeKey: 方法,如果有,走方法内实现,如果还没有,就会抛出异常,引起崩溃。

  valueForKey: 方法的执行步骤 (假如key是name)

// 1、去类里面找是否有一个方法叫 name ,有的话取值,没有的话执行第二步

// 2、去类里面找是否有一个实例变量叫 _name ,有的话取值,没有的话执行第三步

// 3、去类里面找是否有一个实例变量叫 name ,有的话取值,没有的话执行第四步

// 4、查找当前类是否实现了 valueForUndefinedKey: 方法,如果有,走方法内实现,如果还没有,就会抛出异常,引起崩溃。

  

  避免上述两个方法崩溃的方法:- (void)setValue:(id)value forUndefinedKey:(NSString *)key

  // 此方法超强

  // 1、如果字典中的key多于模型中的实例变量时,我们可以重写此方法,内部空实现,来避免赋值不匹配时出现的崩溃问题。

  // 2、可以处理特殊情况,比如字典中的key值是系统保留字,那么这时赋值就会出现问题,我们可以在内部做异常处理。

转载于:https://www.cnblogs.com/hyl2012/p/5213363.html

OC第八节 内存管理高级相关推荐

  1. 黑马程序员--Objective-C之--OC中的内存管理

    ------IOS培训期待与您交流! ------- 对于面向对象的变成语言,程序需要不断地创建对象. 初始,创建的所有程序通常都有指针指向它,程序可能需要访问这些对象的实例变量或调用这些对象的方法, ...

  2. IOS第四节:OC中的内存管理机制

    [自动释放池] [autorelease方法和自动释放池] 每一个对象都有一个autorelease方法,调用autorelease方法之后不会像调用release方法一样马上释放对象, 当一个对象调 ...

  3. OC内存管理常见面试题整理

    1:简述OC中内存管理机制.与retain配对使用的方法是dealloc还是release,为什么?需要与alloc配对使用的方法是dealloc还是release,为什么?readwrite,rea ...

  4. 内存管理-定时器循环、内存布局、tagged pointer、weak指针、copy、自动释放池

    先上代码,我们平时用的定时器,cadisplaylink.nstimer,CADisplayLink.NSTimer会对target产生强引用,如果target又对它们产生强引用,那么就会引发循环引用 ...

  5. Objective--C内存管理基础

    2016-08-01 15:36:30 OC中的内存管理: Objective--C增加了垃圾回收机制,作为初学者,需要清楚内存的管理,什么时候该申请内存,什么时候该释放内存,养成良好的编程习惯,开发 ...

  6. ios 内存管理的理解(一) 简述

    1. 内存管理的范围 所有的OC对象(继承自NSObject类) 本质原因:是因为对象和其他数据类型在系统中的存储空间不一样,其他局部变量主要存放于栈中,而对象存储于堆中. 当代码块结束时,这个代码块 ...

  7. Objective-C基础3:内存管理续

    1.上篇我们讲了OC中的内存管理基础,我们再总结一下何时该用内存管理. 1)当用new.alloc.copy创建对象时,必须要释放对象. 2)当拥有对象时,如果是临时对象,不需要释放:当需要长时间保留 ...

  8. iOS - 内存管理

    一.App 内存分布 二.OC对象的内存管理 iOS 中,使用引用计数来管理 OC 对象的内存,新创建的 OC 对象引用计数默认是1,当引用计数减为0,OC对象就会销毁,释放其占用的内存空间.调用 r ...

  9. iOS底层原理之内存管理

    文章目录 定时器 CADisplayLink.NSTimer GCD定时器 内存管理 iOS程序的内存布局 Tagged Pointer OC对象的内存管理 拷贝 引用计数的存储 dealloc 自动 ...

最新文章

  1. AjaxControlToolKit之DragPanelExtender用法
  2. stm32 udp连续发送大量数据_TCP和UDP详解
  3. 第六周项目二-带武器的游戏角色
  4. 软件测试团队分为哪些人员,产品团队、开发团队和测试团队是什么关系?
  5. 移动硬盘改台式机硬盘_如何在台式机或移动设备上离线使用Google云端硬盘
  6. 物联网模式下的多活数据中心架构认识与实践
  7. ewsa 字典_湖南字典头条胖U
  8. 物联网卡定位技术涉及范围及工作原理
  9. Matlab中fsolve传递系数变量
  10. java图书管理系统毕业设计_java图书管理系统毕业论文
  11. Android 继承于PopuWindow的自定义弹出窗体
  12. html5 双指缩放图片,js实现移动端图片预览:手势缩放, 手势拖动,双击放大......
  13. c语言双目运算和单目运算符,单目运算符 双目运算符 三目运算符
  14. 你所不知的X86 CPU微码机制
  15. 用Excle给自己的证件照换底色(蓝底一键换红底),超级简单
  16. 在misc中涉及的二维码
  17. Android基础控件—SearchView
  18. Result统一响应数据
  19. linux添加黑体和宋体,linux添加字体
  20. 【AI浅谈】AI算法,用尽可能简单的话讲懂AI的原理【1】

热门文章

  1. 【SSM框架系列】Spring IoC(控制反转) DI(依赖注入)注解开发
  2. DOM中setTimeout() 方法用于在指定的毫秒数后调用函数或计算表达式。
  3. java生成二维码/java解析二维码
  4. 让bind函数支持IE8浏览器的方法
  5. iOS中改变部分字体颜色
  6. React Native开发环境搭建
  7. Apache经常使用配置
  8. 浅谈移动端中的视口(viewport)
  9. 并发编程之 锁的优化有哪些
  10. 5.25. Spring boot with Git version