@lass关键字 ARC机制
OC加强day02
@class关键字
- 两个类A和B, 如果互相#import对方头文件,会造成死循环
- 解决方式
- 在其中的一方,不要用#import
#import "B.h"
@interface A : NSObject@end//#import "A.h"@class A;//告诉编译器 有名字叫做A这么一个类
@interface B : NSObject@end#import "A.h"
@implementation B
{}
- #import和@class的区别
- 归属的类型不同
- #import是预处理指令在编译之前就进行内容转换
- @class 类名 这是一句OC代码
- 作用不同
- #import拷贝 包含在头文件的内容
- @class 类名 仅仅是告诉编译器这是一个类、
- 归属的类型不同
循环retain
- 什么是循环retain
- A类中有一个属性是B类的对象
- B类中有一个属性是A累的对象
- 这时候如果A类中 B类的对象用retain参数
- B类中的A类对象也用retain参数
- 那么就会造成循环retain, 导致内存泄漏
- 解决方法:
- 一段用retain 一段用assign
- **注意: 用assign的那一端 在dealloc中 不需要调用release
自动释放是
- 自动释放池是什么?
用来存放对象的一个池子
存储在自动释放池中的对象,当自动释放出销毁的时候,会向存储池子中的”所有对象”发送一条release消息
如果把一个对象放入自动释放池中?
只要在自动释放池的范围内 调用对象的autorelease方法,就可以把对象放入池子中了自动释放池的好处
唯一好处:可以省略创建对象以后要匹配的那个release代码
自动释放池的七大注意- 只有在自动释放池中 调用了 autorelease方法 才,才是将这个对象存储在了自动释放池中
- 对象的创建可以在在自动释放池的外面 然后再自动释放池中调用方法,
- 自动释放池结束的时候 仅仅是为在池子中的对象发送了一条release消息
- 如果自动释放池中调用了同一个对象多次那么就会在结束的时候多次返回release消息 会出现将是对象错误
- 如果在释放池中调用了release方法 那么在池子结束后还会调用一次 会出现野指针
- 将对象存储到自动释放池中 并不会是对象的引用计数器+1
- 自动释放池也可以嵌套 只有在当前自动释放池结束的时候就会向对象发送release消息
自动释放池的规范
- 如果使用类方法创建一个对象, 要求必须在这个对象在方法中已经被 autorelease过了
ARC机制
- 什么是ARC
- 自动引用计数器
- 编译器会在适当的情况下自动释放对象
- ARC下对象是怎么回收的?
- 本质上:不管在MRC还是ARC 对象的引用计数器的值为0的时候回收
- 表象上
- 一个对象如果没有任何强指针指向的时候他就会被立即回收
- 强指针和弱指针
- 强指针: 用__strong修饰的指针(默认)
- 弱指针: 用__weak就是的指针
- 作用: 用来判断对象是否可以被系统回收
@property参数 strong 和weak
- @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机制先得循环引用
- 什么是循环引用
- 当对象A中有对象B作为属性
- 而且 对象B中有对象A作为属性
- 如果这两个属性 都是用__strong修饰那么就会形成循环引用
- 就会导致两个对象都不能回收
2.例题:
人类Person:{电脑属性;}电脑类Computer:{人属性(拥有者);}
@property 参数总结
- 1.
- atomic <—-> nonatomic
- 这两个参数,无论在MRC还是ARC都可以使用
- 2.
- retain: 只能使用在MRC模式下,在MRC模式先 当属性的类型是OC对象的时候,绝大多数场景下使用
- assign 可以使用在ARC和MRC模式下。
- 在ARC下 : 当属性的类型是非OC对象的时候 一律使用assign
- 在MRC模式下: 当属性循环引用的时候 1边使用assign一遍使用retain
- 3.
- strong:只能使用在ARC模式下,当属性的类型是OC对象的时候 绝大多数场景使用strong
- weak: 只能使用在ARC模式下,当出现循环引用的时候,一遍使用strong一遍使用weak
- 4.
- getter setter 修改方法名字
- 5.
- readonly
- readwrite
- 无论MRC ARC都可以使用
MRC终极写法
@property(nonatomic,assign(非OC对象)/retain(OC对象))类型 属性名称大部分情况只要有OC对象就用 retain当出现循环retain时候一段就用retain 一段用 assign
ARC终极写法
@property(nonatomic,assign(非OC对象)/weak/strong)类型 属性名大部分情况只要OC对象就使用strong当出现循环引用的时候 一段 weak 一段strong
@lass关键字 ARC机制相关推荐
- 自动释放池 ARC机制
IOS学习第24天 @class 1.两个类A和B,如果互相#import对方头文件,会造成死循环2.解决方式: 在其中的一方,不要用#import <xxx.h>来引入对方的头文件,用@ ...
- ios5 ARC机制介绍和使用
参考http://www.yifeiyang.net/development-of-the-iphone-simply-1/ http://blog.csdn.net/diyagoanyhacker/ ...
- JAVA synchronized关键字锁机制(中)
synchronized 锁机制简单的用法,高效的执行效率使成为解决线程安全的首选. 下面总结其特性以及使用技巧,加深对其理解. 特性: 1. Java语言的关键字,当它用来修饰一个方法或者一个代码块 ...
- 06 - Object-C ARC机制
2019独角兽企业重金招聘Python工程师标准>>> ##一.简介 ARC是自iOS 5之后增加的新特性,完全消除了手动管理内存的烦琐,编译器会自动在适当的地方插入适当的retai ...
- iOS之深入解析内存管理MRC与ARC机制
一.内存管理 ① 什么是内存管理? 当我们编写程序的时候,会声明各种各样的变量,编写各种各样的代码,它们都会占用内存,但是并不是所有的代码和内存都是由我们进行释放. 内存分为 5 个区域:栈.堆.bs ...
- ARC内存管理机制详解
ARC在OC里面个人感觉又是一个高大上的牛词,在前面Objective-C中的内存管理部分提到了ARC内存管理机制,ARC是Automatic Reference Counting-自动引用计数.有自 ...
- 手把手教你ARC——iOS/Mac开发ARC入门和使用
本文部分实例取自iOS 5 Toturail一书中关于ARC的教程和公开内容,仅用于技术交流和讨论.请不要将本文的部分或全部内容用于商用,谢谢合作. 欢迎转载本文,但是转载请注明本文出处:http:/ ...
- ios基础之 ARC
ios ARC 1 什么是ARC Automatic Reference Counting 自动引用计数 即ARC 顾名思义 系统自动的帮助我们去计算对象的引用计算器的值 可以说是WDC 2011 和 ...
- iOS开发ARC入门和使用
本文部分实例取自iOS 5 Toturail一书中关于ARC的教程和公开内容,仅用于技术交流和讨论.请不要将本文的部分或全部内容用于商用,谢谢合作. 欢迎转载本文,但是转载请注明本文出处:http:/ ...
最新文章
- 移动端iPhone系列适配问题的一些坑
- mdb导入SqlServer
- oracle银行卡号检查约束,oracle约束学习(1)unique和check
- OpenCV基本步骤(初步学习)
- 今年618我要Pick有很吓人技术GPU TURBO的手机,你呢?
- Boost:等待和通知操作的模糊测试
- 微信小程序的点击复制功能
- python构造数组并命名_Numpy数组追加命名列
- 阿里涉足零售 IoT 的猜想
- openstarck安装指南(图文详解,超小白版本)
- HashTable VS Dictionary
- 【雕刻机】安装破解Artcam2017
- 基于三维冲击波的变分理论--交通运输工程(一)
- layui之 实现图片放大
- Win10(winser2019)关闭驱动数字签名方法
- php数独,详解PHP如何实现数独求解
- 斐讯设备远程控制教程(以K3、N1为例)
- ROS解决'[rosrun] Couldn't find executable named ...'
- Docker生态系统:常规组件简介
- 免云挂机聚合易支付码支付V6.5修正版系统源码
热门文章
- GEE数据集——PML_V2 0.1.7: 蒸散量与初级生产总值(GPP)耦合
- 跟着鬼哥学so改动,二,进行篇
- java有效的关键字name_如下哪些是Java中有效的关键字()
- docker stop rm rmi 命令
- linux alsa 录音程序,转 alsa录音放音执行流程详解
- ES启动报错:Caused by: java.lang.IllegalArgumentException: can‘t add node {es2}
- 赵大超的学习周志(二)
- Linux下的NTP
- 什么牌子的蓝牙耳机音质好?十大公认音质好的无线蓝牙耳机
- FastDFS--原理篇