博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Objective - C基础: 第六天 - 1.ARC自动引用计数的基本认识
阅读量:5273 次
发布时间:2019-06-14

本文共 3120 字,大约阅读时间需要 10 分钟。

前言:

在前面, 我们学习了手动引用计数, 遵循了写一个alloc就写一个release的原则, 也学习了autorelease内存池, 在创建对象的时候调用autorelease方法, 就会在内存池销毁的时候就会对对象进行一次release操作, 但autorelease不能随便乱用, 对多占用内存比较大的最好还是使用手动引用计数, 但这两种方法我们都很懊恼, 很费劲, 必须得写那么一大堆垃圾代码才能完成操作, 而这时候, ARC出来了, ARC可以解决我们前面两个的问题, 下面让我们一起来看看什么是ARC.

开始:

ARC, 也称为自动引用计数, 为什么这么说? 因为它真的可以在我们不写release或者autorelease的情况下帮我们释放对象, 所以才称为自动引用计数, 那么它的原理是怎么样的呢? 让我们一起来看看:

#import 
@interface Person : NSObject@property (nonatomic, assign) int age;@end@implementation Person- (void)dealloc{ NSLog(@"Person被释放了.");}@end
#import 
#import "Person.h"int main(int argc, const char * argv[]){ Person *p = [[Person alloc] init]; p.age = 10; NSLog(@"age = %d", p.age); return 0;}
打印的结果;

2015-01-28 21:12:53.790 1.ARC机制[1744:108489] age = 102015-01-28 21:12:53.791 1.ARC机制[1744:108489] Person被释放了.

有人可能会疑惑, 为什么你的dealloc没有写[super dealloc]?  其实这个就是ARC机制, 后面我们会讲, 那ARC是怎么判断对象是否要release的呢??

其实这里涉及到两个东西, 一个是强指针(strong), 一个是弱指针(weak), 在ARC中, 只要没有强指针指向对象, 那么该对象就会被释放, 我们把上面的那个例子稍微的改一下看看:

#import 
@class Car;@interface Person : NSObject@property (nonatomic, assign) int age;@property (nonatomic, strong) Car *car;@end@implementation Person- (void)dealloc{ NSLog(@"Person被释放了.");}@end
#import 
@interface Car : NSObject@end@implementation Car- (void)dealloc{ NSLog(@"Car对象被释放了.");}@end
#import 
#import "Person.h"#import "Car.h"int main(int argc, const char * argv[]){ Car *c = [[Car alloc] init]; Person *p = [[Person alloc] init]; p.age = 10; p.car = c; NSLog(@"p = %@", p); NSLog(@"c = %@", c); return 0;}
打印出来的结果:

2015-01-28 21:21:02.288 1.ARC机制[1791:111925] p = 
2015-01-28 21:21:02.289 1.ARC机制[1791:111925] c =
2015-01-28 21:21:02.289 1.ARC机制[1791:111925] Person被释放了.2015-01-28 21:21:02.289 1.ARC机制[1791:111925] Car对象被释放了.

我就不在这里算引用计数了, 大家喜欢的话, 可以自己去数数~~

上面那个是strong的例子, 下面我们再来看看weak的例子:

#import 
@class Car;@interface Person : NSObject@property (nonatomic, assign) int age;@property (nonatomic, weak) Car *car;@end
#import 
#import "Person.h"#import "Car.h"int main(int argc, const char * argv[]){ Car *c = [[Car alloc] init]; c = nil; Person *p = [[Person alloc] init]; p.age = 10; p.car = c; NSLog(@"p = %@", p); NSLog(@"c = %@", c); return 0;}
打印出来的结果:

2015-01-28 21:23:13.932 1.ARC机制[1803:112785] Car对象被释放了.2015-01-28 21:23:13.933 1.ARC机制[1803:112785] p = 
2015-01-28 21:23:13.933 1.ARC机制[1803:112785] c = (null)2015-01-28 21:23:13.933 1.ARC机制[1803:112785] Person被释放了.

这么看大家可能看不懂, 下面我来给大家画一个示意图:

强指针

弱指针

强指针我就不解释了,  原理和手动引用计数的多个对象使用是一样的, 主要来讲讲weak指针, 按照我们最后的例子来讲, 当c = nil之后, 那么c就不再指向Car对象, 根据我们ARC的判断准则来说, 一旦没有强指针指向于对象, 那么该对象就会被释放, 所以我们打印出来c的地址是空的.

总结:

ARC的判断准则:只要没有强指针指向对象,就会释放对象

1.ARC特点

1> 不允许调用releaseretainretainCount

2> 允许重写dealloc,但是不允许调用[super dealloc]

3> @property的参数

* strong :成员变量是强指针(适用于OC对象类型)

* weak :成员变量是弱指针(适用于OC对象类型)

* assign : 适用于非OC对象类型

4> 以前的retain改为用strong

 

指针分2种:

1> 强指针:默认情况下,所有的指针都是强指针 __strong

2> 弱指针:__weak

好了, 这次我们就讲到这里, 下次我们继续~~

转载于:https://www.cnblogs.com/iOSCain/p/4282821.html

你可能感兴趣的文章
如何使用iClap创建普通批注
查看>>
用Java编写自己的机器人,为你承担苦力
查看>>
第四章App4_3,懂得了抛出异常 throws Exception,read为读取键盘输入数,学会了switch循环...
查看>>
从零开始——MySql01
查看>>
基于线程池的线程管理(BlockingQueue生产者消费者方式)实例
查看>>
sqlmap
查看>>
给出随机存储器(RAM)和只读存储器(ROM)的差别
查看>>
CSS3 3D Transform
查看>>
js深拷贝
查看>>
http和socket之长连接和短连接区别(转)
查看>>
【HTML】网页中如何让DIV在网页滚动到特定位置时出现
查看>>
文件序列化
查看>>
C++11 中的线程、锁和条件变量
查看>>
HDU 2485 Destroying the bus stations(!最大流∩!费用流∩搜索)
查看>>
Oracle关于用户信息的一些SQL语句
查看>>
2019-02-28处理公司同事无法上网事件记录
查看>>
cookie的过期时间
查看>>
HTCVive使用
查看>>
Javascript 浏览器检测
查看>>
Java程序员常用工具类库
查看>>