IOS学习第24天

@class

1.两个类A和B,如果互相#import对方头文件,会造成死循环2.解决方式:
在其中的一方,不要用#import <xxx.h>来引入对方的头文件,用@class 对方的类名
#import "B.h"
@interface A : NSObject@end//#import "A.h"@class A;//告诉编译器 有名字叫做A这么一个类
@interface B : NSObject@end#import "A.h"
@implementation B
{}
最后:
#import 和@class 的区别1>归属的类型不同#import 是预处理指令,在编译之前会进行内容替换@class 类名 这是一句OC代码2>作用不同#import 拷贝包含的头文件,替换到写包含指令的这一行@class 类名 :仅仅是告诉编译器 有这么一个类```
###循环retain

1.什么是循环retain?
A类中有一个属性是B类的对象
B类中有一个属性是A类的对象
这时候如果A类中 B类的对象用retain参数
B类中的 A类对象也用retain参数
那么就会造成循环retain,导致内存泄漏

2.解决方法:
一段用retain 另外一端用assign

注意:用assign的那一端 在dealloc中 不需要再调用release


###自动释放池的使用

1.自动释放池是什么?
用来存放对象的一个池子
存储在自动释放池中的对象,当自动释放出销毁的时候,会向存储池子中的”所有对象”发送一条release消息

2.如果把一个对象放入自动释放池中?
只要在自动释放池的范围内 调用对象的autorelease方法,就可以把对象放入池子中了

2.自动释放池的好处

唯一好处:可以省略创建对象以后要匹配的那个release代码
```
  • 使用自动释放池的七大注意
1). 只有在自动释放池中调用了对象的autorelease方法,这个对象才会被存储到这个自动释放池之中.如果只是将对象的创建代码写在自动释放之中,而没有调用对象的autorelease方法.是不会将这个对象存储到这个自动释放池之中的.2). 对象的创建可以在自动释放池的外面,在自动释放池之中,调用对象的autorelease方法,就可以将这个对象存储到这个自动释放池之中.将1个对象存储到自动释放池中,最重要的步骤调用对象的autorelease方法,这句代码一定要放在池子中.3). 当自动释放池结束的时候.仅仅是对存储在自动释放池中的对象发送1条release消息 而不是销毁对象.4). 如果在自动释放池中,调用同1个对象的autorelease方法多次.就会将对象存储多次到自动释放池之中.
在自动释放池结束的时候.会为对象发送多条release消息.那么这个时候就会出现僵尸对象错误.
所以,1个自动释放池之中,只autorelease1次,只将这个对象放1次, 否则就会出现僵尸对象错误.5). 如果在自动释放池中,调用了存储到自动释放中的对象的release方法.
在自动释放池结束的时候,还会再调用对象的release方法.
这个时候就有有可能会造成野指针操作.也可以调用存储在自动释放池中的对象的retain方法.6). 将对象存储到自动释放池,并不会使对象的引用计数器+1
所以其好处就是:创建对象将对象存储在自动释放池,就不需要在写个release了.7).  自动释放池可以嵌套.
调用对象的autorelease方法,会讲对象加入到当前自动释放池之中
只有在当前自动释放池结束的时候才会像对象发送release消息.
  • 自动释放池的规范

如果使用类方法创建一个对象,要求必须这个对象在方法中已经被autorelease过了

ARC

**弱指针在对象被回收后自动设置为nil

  • ARC机制的概述
1.什么是ARC?自动引用计数器管理:编译器会在适当,适当地点插入和内存管理有关系(retain release autorelease,dealoc)2.ARC下对象是怎么回收本质上:不管在MRC 还是ARC,对象的引用计数器的值为0的时候回收3.表像上一个对象 如果有没任何的强指针指向的时候 他会被系统立即回收
4.强指针 和 若指针强指针:指针如果前面有__strong修饰指针[默认]若指针:指针如果前面有__weak修饰指针
在ARC下 强指针 和若指针有什么区别?没有任何区别是系统会根据 有没有强指针指向对象 来判断对象是否可以被回收
  • @property参数strong与weak
1.@property参数strong与weak
作用:@property 自动生成的私有属性 到底是强指针 还是 弱指针"@property (strong/weak) NSString * name;strong:生成的私有属性是强指针
weak:生成的私有属性是弱指针在ARC机制下 setter方法的实现 就是直接赋值 不需要做任何事情在ARC下 不能用retain,因为retain是指生成的setter方法的实现 中 是标准的内存管理代码一般来说在MRC下用retain参数 ---> ARC下就用strong
一般来说在MRC下用assign参数--->ARC下就用assign
  • ARC机制下的循环应用
1.什么是循环引用当对象A中有对象B作为属性而且 对象B中有对象A作为属性如果这两个属性 都是用__strong修饰那么就会形成循环引用就会导致两个对象都不能回收2.例题:人类Person:{电脑属性;}电脑类Computer:{人属性(拥有者);}3.人对象中拥有电脑对象属性,电脑对象中拥有人对象属性.那么会导致电脑和人对象都不能释放.
"解决方案:一端用strong 一端用weak```* property参数总结
  1. 与多线程相关的参数.
    atomic:
    nonatomic:
    这两个参数,无论在MRC还是ARC下都可以使用. 使用nonatomic

  2. retain: 只能使用在MRC模式下.
    在MRC模式下: 当属性的类型是OC对象的时候,绝大多数场景之下使用retain.

assign: 可以使用在ARC和MRC模式之下.

在ARC下: 当属性的类型是非OC对象的时候,一律使用assign.
在MRC模式下: 当属性的类型是非OC对象的时候,一律使用assign.

在MRC模式下.出现循环引用的时候. 1边使用assign 1边使用retain.

  1. strong: 只能使用在ARC模式下.当属性的类型是OC对象的时候,绝大多数场景之下使用strong.
    weak:只能使用在ARC模式下 当出现循环引用的时候.1边使用strong 1边使用weak.

  2. getter setter 修改方法名字.
    无论是ARC还是MRC都可以通过他们修改方法的名字.

  3. readonly
    readwrite.
    无论MRC还是ARC都可以使用

终极写法
MRC:
@property (nonatomic,assgin(非OC对象)/retain(OC对象)) 类型 属性名称
大部分情况 只要是OC对象 用retain
当出现 循环retain时候
一端用retain 另外一端用assign

ARC:
@property (nonatomic,assign(非OC对象)/weak/strong) 类型 属性名称
大部分情况只要是OC对象就是strong
当出现循环引用的时候 一端用weak  一端用strong

* MRC与ARC的兼容** 选中MRC文件,双击后输入 -fno-objc-arc **###分类* 分类的简单使用

1.什么是分类
当一个类包含了非常的多的属于不同范畴的方法的时候,我们通常将这个类用多个文件来实现,其中有一个类叫主/本类,剩余的叫分类

2.有了分类之后
一个类 = 所有分类 + 本类
3.如何添加分类:
newFile–> 选中OC File –>选择category
—>填写分类名,本类名

4.分类的声明
@interface 本类名 (分类名)

@end@implementation 本类名 (分类名)@end

5.如何使用分类
只要在使用的时候导入分类即可
“`

自动释放池 ARC机制相关推荐

  1. (转)Objective-C Autorelease Pools(自动释放池)详解

    本篇将给您介绍"Autorelease Pools"(自动释放池)在应用中的使用技巧. 1,Autorelease Pools概要 一个"Autorelease Pool ...

  2. iOS内存管理 —— 自动释放池和runloop

    iOS内存管理 -- 自动释放池和runloop 1. 自动释放池 1.1 自动释放池介绍 1.2 自动释放池底层原理 objc_autoreleasePoolPush autoreleaseNoPa ...

  3. 自动释放池autoreleasepool

    自动释放池是NSAutoreleasePool的实例,其中包含了收到autorelease消息的对象.当一个自动释放池自身被销毁(dealloc)时,它会给池中每一个对象发送一个release消息(如 ...

  4. 【深入Cocos2d-x】探索Cocos2d-x中的内存管理-引用计数和自动释放池

    2019独角兽企业重金招聘Python工程师标准>>> #深入Cocos2d-x-探索Cocos2d-x中的内存管理-引用计数和自动释放池 ###引用计数(Reference Cou ...

  5. 第六讲:Obj-C 内存管理4 - 自动释放池

    转:http://tigercat1977.blog.163.com/blog/static/2141561122012111294616203/ 第六讲:Obj-C 内存管理4 - 自动释放池 主要 ...

  6. iOS之深入解析自动释放池autoreleasepool的底层原理

    一.自动释放池 autoreleasepool 原理 自动释放池是 OC 中的一种内存自动回收机制,它可以将加入 autoreleasePool 中的变量 release 的时机延迟. 简单来说,就是 ...

  7. 【iOS高级资深工程师面试篇】④、2022年,金九银十我为你准备了《iOS高级资深工程师面试知识总结》 内存管理部分2/2 引用计数-弱引用-自动释放池-循环引用

    iOS高级资深工程师面试篇系列 - 已更新3篇 UI部分1/3 -UITableView-事件传递&视图响应 UI部分2/3 -图像显示原理-UI卡顿&掉帧 UI部分3/3 -UIVi ...

  8. [Objective-C] 自动释放池(Autoreleasepool)--拆迁队的外援

    C#妹妹:内存的清理跟生活中的拆迁一样是个麻烦事情啊 Objective-C阿姨:是啊,该拆的不拆,占用空间,不该拆的拆了,程序崩溃 C#妹妹:说白了,难度不在拆上,在判定上,判断到底那些内存是用不上 ...

  9. 《C#妹妹和Objective-C阿姨对话录》(05)自动释放池--拆迁队的外援

    C#妹妹:内存的清理跟生活中的拆迁一样是个麻烦事情啊 Objective-C阿姨:是啊,该拆的不拆,占用空间,不该拆的拆了,程序崩溃 C#妹妹:说白了,难度不在拆上,在判定上,判断到底那些内存是用不上 ...

最新文章

  1. App_GlobalResources、App_LocalResources (理论篇)(
  2. float取整数部分_一步一步学Python3(小学生也适用) 第六篇: 变量及整数(int)类型...
  3. 修改用户名_新华美育查找用户名及修改密码的方法分享
  4. 小知识点BeanUtils.copyProperties
  5. ASP.NET Web Game 架构设计1--服务器基本结构
  6. (六)python3 只需3小时带你轻松入门——循环
  7. 前端学习(536):多列布局3列得间距
  8. C#使用Sockets操作FTP【转载】
  9. 《Spark The Definitive Guide》Chapter 6:处理不同类型的数据
  10. vs visual stdio 调试 显示指针为数组
  11. Hive DDL DML
  12. 用ado.net取数据库中table、column的信息
  13. Atitit Java制作VCARD vcf 以上就是关于vCard的基本介绍,维基百科(英文)https://en.wikipedia.org/wiki/VCard写的比较全,可惜我看不懂。
  14. 微信接口java解密_微信小程序Java登录流程(ssm实现具体功能和加解密隐私信息问题解决方案)...
  15. iir滤波器c语言程序,请教C语言做iir滤波器问题
  16. 逐浪海棠居刻本字-第一款基于unicode13标准构建的中文字库全面发布
  17. 基于JavaEE的山水房屋中介管理系统_JSP网站设计_SqlServer数据库设计
  18. 新手学习易语言必须掌握的命令
  19. ts版操作localStorage和sessionStorage工具
  20. 一天上手Aurora 8B/10B IP核(4)----从Streaming接口的官方例程学起

热门文章

  1. 指针,指针,指针。。。
  2. 附近商家位置java开发附近定位
  3. matlab练习(11.7)
  4. 计算机写字的好处,喜欢写字的十大好处!
  5. 二维码生成器-客户端
  6. 串口---UART RS232 RS485 TTL
  7. 2020无人用的邮箱和密码大全_2020抖音文案大全:这4大抖音文案技巧,点赞100w的账号都在用...
  8. HIT软件构造第六章一二节知识点总结
  9. 电子版药丸,监控你的健康
  10. 3个月“零基础”考研上岸复旦软院