oc的ARC的内存管理

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对象类型(基础类型) 

2,注意

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机制介绍和使用
3Category分类

4block
================================
今天的主要知识点 ================================

---------------- 知识点细节 -----------------------------------------------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){};

--------------------------------知识点细节 --------------------------------- 






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值