RAC的内存管理
1,指针分类
强指针:在oc中默认的都是强指针 ,关键字是srtong
弱指针: __weak关键字的修饰符
声明一个弱指针 __weak Car *c;
2,什么是ARC
arc代替arc的手动内存管理
1,基本原则
永远不要出现mrc中的,retain,release,autorelease这几个关键字
3,ARC的工作原理
arc判断的基本准则
没有强指针指向的对想就会被释放
注意:使用arc的时候不是引用计数器了,标准变了
只要某个对象被一个任何强指针指向就不会被销毁
__weak就相当于赋值为nil;
4,arc的快速使用
1,创建项目是默认的都是arc
标志:对象不允许调用relasea
[对象 release];
2,不允许调用autorelease
对象 autorelease;
3,在从写父类方法时不用再调用 super dealloc
5,arc的内存管理
1,如果对象被复制为nil;
在调用对象方法是不会报错,但是打印的值为0
在arc对象被赋值为nil时,僵尸对象。开启僵尸对象检测也不会报错值打印不出来
6,arc的多个内存管理
这里arc机制下不能出现retain 所以应该是srtong,weak
两个对象谁先用weak ,就先释放谁。
7,arc的循环引入的问题
循环引入就是默认情况下,都是强指针谁都释放不了谁,所以需要一个对象用弱指针这样就能释放了
8,arc的@property下的参数
srtong ;用于oc对象 相当于mrc的retain
weak: 相当于assign
assgin 还是用于基本数据类型
循环retain问题一端用 weak,一端用srtong就可以了
9,arc的使用注意
1,arc的总结
1)不允许调用release,retain,retainCount(2)允许重写dealloc,但是不允许调用[superdealloc](3)@property的参数:
strong:相当于原来的retain(适用于OC对象类型),成员变量是强指针weak:相当于原来的assign,(适用于oc对象类型),成员变量是弱指针assign:适用于非OC对象类型(基础类型)
1,弱指针指向对象对象就不在了,就直接把弱指针清空赋值为nil;
2.)ARC中在property处不再使用retain,而是使用strong,在dealloc中不需要再
[super dealloc]。
10,arc的兼容和转换
让程序兼容ARC和非ARC部分。转变为非ARC-fno-objc-arc转变为ARC的, -f-objc-arc。
11,category的使用
1.类别的作用
在不修改原来的类的基础上加新的方法
2.类别的目的
作为子类的代替手段
3. 使用步骤
声明一个类 实现一类 使用类
命名规范 类名 +扩展方法
12,category的声明和实现
在.h文件中类别的声明
@interface 带扩展名 :(分类的名)
@end
类的声明格式
添加新的方法必须写在@interface 与 @end之间
**不允许在声明类中定义变量
实现.m
@interface 带扩展名 :(分类的名)
@end
使用的方法
和平常使用一样
必须包含类别的头文件
13,category的注意使用、
1,在分类中不能使用声明变量 ,不能实例变量,也不能使用@property
2,在分类中可以访问实例变量
3,在分类中存在和类的同名方法,优先访问分类中的方法
4, 分类多个中都含有同名方法 ,执行最后编译的同名类
原类 >原类
14,block的使用
block最简单的形式
定义 :
void (^block) ()=^{代码块;}
使用格式
定义时,把block当成数据类型
特点:
1.类型比函数定义多了一个^
2. 设置数值,有一个^,内容是{}括起的一段代码
最简单的定义方式
void (^myBlock)() = ^ { //代码实现; }
2) block带有参数的block的定义和使用
格式:
void (^block名称)(参数列表)
= ^ (参数列表) { //代码实现; }
//定义有参数的block
void(^sumBlock)(int,int) = ^ (intx, inty) {
NSLog(@"%d", x + y);};
//调用blocksumBlock(10,20);
3) 带有参数和返回值的block
格式:
返回类型 (^block名称)(参数列表)= ^ 返回类型(参数列表) { // 代码实现; }
//定义有返回值和参数的block
int(^sumBlock2)(int,int) = ^int(inta, intb) {
returna + b;};
//调用有返回值的blockNSLog(@"%d", sumBlock2(4,8));
================================今天的主要知识点 ================================1、对象的自动释放池的使用
2、ARC机制介绍和使用
3、Category分类
4、block
================================ 今天的主要知识点 ================================
---------------- 知识点细节 -----------------------------------------------1.对象自动释放池的使用
* autorelease方法
* @autoreleasepool关键字的使用
* 封装一个initWithXxx方法, 在其中使用"对象自动释放池"
2. ARC介绍
* ARC概念介绍
* ARC的判断原则/强弱指针介绍*循环strong问题
* MRC代码转ARC代码
1. @autoreleasepool的嵌套使用(栈方式来存储)
* instancetype只能用作返回值, 不能使用instancetype来声明变量* id和 instancetype 的区别
/*
id -> NSObject *id类型是可以用来声明变量的
instancetype -> 在哪个类中, 表示的就是哪个类型的指针 XXXX *instancetype只能用作方法的返回值, 不能通过instancetype来声明变量*/
* 自动释放池是以栈结构来存储的
2. Category分类
* 分类的作用:
1> 将一个类中的不同方法分到多个不同的文件中存储, 便于对类进行模块化设计、团队合作
开发。
分区 第二天(@传智如意大师) 的第108 页
开发。
2> 可以在不修改原来类的基础上, 为这个类扩充一些方法.
* 分类中只能增加"方法", 不能增加成员变量、@property等。*分类可以访问原来类中的成员变量
* 主类与分类中方法的调用优先级问题:
1> 当分类与主类中都有同一个方法的时候, 优先调用分类中的方法。
2> 当多个分类中都有同样的一个方法的时候, 优先调用最后一个参与编译的分类中的方法。
* 类扩展(匿名分类)
0> 类扩展是写在.m文件中的, 为当前类扩展一些私有的成员.
1> 作用: 为某个类扩充一些私有的成员变量和方法.
2> "类扩展"对比"分类", 就少了一个分类名称, 因此也有人称它为"匿名分类".
3. block
* block是一种数据类型, 可以使用这种数据类型定义变量, 并赋值。
* block数据类型在使用前需要先定义该数据类型, 然后再使用(就像使用Person类一样, 先
定义一个Person类, 然后再通过Person类声明一个Person类型变量)。* block这种数据类型用来保存一个方法、函数、一段代码
* 必须掌握: block的定义语法、使用场景
* 使用inlineBlock辅助编写block代码
//int (^block)(int,int) = ^(int n, int m){};int (^block)(int,int) = ^(int n, int m){};
--------------------------------知识点细节 ---------------------------------