博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
OC语言基础三:OC手动内存管理
阅读量:3730 次
发布时间:2019-05-22

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

文章目录

OC手动内存管理又叫做手动引用计数,简称为MRC,IOS4.0之前使用的一种内存管理方式,之后提出了ARC。有了ARC我们可以把所有的精力放在项目的开发之上,系统给我们自动完成内存管理。

OC内存管理原则

只要使用以alloc,new, copy,mutableCopy, retain(这五个单词开头的方法)将一个对象的地址赋给一个指针变量时,该对象指针就拥有这个对象的绝对使用权,就会导致这个对象的引用计数加一,使用后就要进行release或autorelease来释放对象。(最终加一,减一的个数要一样,达到内存的平衡管理。)

示例

Build Settings里Objective-C Automatic Reference Counting参数默认是YES,改为NO。(搜索gar)

重写dealloc函数

-(void)dealloc{   NSLog("person<%p>被销毁",self);   [super dealloc];}

每当我们去调用[super dealloc]的时候这个对象就已经被释放了,所以不能把一些逻辑写在这个方法调用之后。写在之后的话很可能因为去使用一个已经释放的对象而造成内存崩溃。

int main(int argc,const char *argv[]){   @autoreleasepool{     Person *person=[Person new];     [person work];        [person release];   }}

调[person release]会调dealloc函数,如果不调[person release]就会造成内存泄漏。

内存过度释放:
不如上面的例子:调用两次[person release],程序就会在dealloc 函数里崩溃。因为第二次调[person release]就相当于在使用一个不存在的对象,这是在对野指针进行操作。

int main(int argc,const char *argv[]){   @autoreleasepool{     Person *person=[Person new];     [person work];    [person release];    [person work];

虽然第二个 [person work];访问的是僵尸对象,而系统是不会实时监测僵尸对象的,有时在你运行的时候监测到了,它会抛出异常,但有时恰巧你运行的时候它没有监测到僵尸对象这里,它是不会把异常及时得抛出的。

如果想及时得抛出异常,需要调整一个地方。
product-Scheme-Edit Scheme-run-Diagnostics-Enable Zombie Object钩上
person.retainCount,只需要记住retainCount是对象是否被销毁的唯一标志就行了,不要轻易得去使用它,如果非要使用,可能得到一些意想不到的结果,导致程序运行结果不准确。

autorelease的使用:

Person *person=[[[self alloc]init]autorelease];

被autorelease标记的类,放到autoreleasepool自动释放池里使用,就会被自动释放池所管理,当出了自动释放池的大括号之外,就会进行对象释放,是我们系统自动完成的,不需要我们操心person类的生命周期了。但是如果另外调了retain函数,就还需要调release释放一下。

转载地址:http://qpwin.baihongyu.com/

你可能感兴趣的文章
那些年,我们一起使用过的case...when
查看>>
flink之内存分配与内存管理
查看>>
一篇由flink akka timeoutException引发的slot和parallelism
查看>>
flink批量(batch)写入mysql/oracle
查看>>
基于flink broadcast实现目标用户的智能筛选
查看>>
Apache Hbase基本概念及Java API
查看>>
flink table & sql(一)table基础概念、环境搭建、source、sink
查看>>
flink table & sql(二)tableAPI
查看>>
flink之Timer定时器
查看>>
hive开启动态分区,文件压缩
查看>>
flink之TTL(Time To Live),State Backend,How to Clear State?
查看>>
flink之Operator State(non-keyed state)
查看>>
flink之checkpoint、savepoint,Flink计算发布之后是否还能够修改计算算子?(指状态恢复)
查看>>
flink window之四大WindowAssigner
查看>>
qt 程序打包
查看>>
python 的excel处理(xlwt+openpyxl+xlwings)
查看>>
python 文件处理
查看>>
c++ code time代码时汇总
查看>>
c++ 模板
查看>>
python django 环境搭建
查看>>