OC----内存管理

任何继承了NSObject的对象,都需要内存管理,
但是对基本数据类型无效(不需要释放)
原理:
  1. 每个对象内部都保存了一个与之相关联的整数,称为引用计数器
  2. 当使用alloc、new或者copy创建一个对象时,对象的引用计数器被设置为1
  3. 给对象发送一条retain消息,可以使引用计数器值+1
  4. 给对象发送一条release消息,可以使引用计数器值-1
  5. 当一个对象的引用计数器值为0时,那么它将被销毁,其占用的内存被系统回收,OC也会自动向对象发送一条dealloc消息。一般会重写dealloc方法,在这里释放相关资源。一定不要直接调用dealloc方法。
  6. 可以给对象发送retainCount消息获得当前的引用计数器值
向对象发送某个消息,相当于调用某个方法。
内存管理原则:
  1. 谁创建,谁释放(“谁污染,谁治理”)。如果通过alloc、new或(mutable)copy来创建一个对象,那么你必须调用release或autorelease。换句话说,不是你创建的,就不用你去释放。
  2. 一般来说,除了alloc、new或copy之外的方法创建的对象都被声明了autorelease
  3. 谁retain,谁release。只要你调用了retain,无论这个对象谁如何生成的,你都要调用release
如果在某个对象方法中retain了另一个对象,需要在这个对象释放的时候同时释放retain的那个对象。
如果想要retain对象新的成员变量,先释放掉旧的成员变量;在释放掉旧的成员变量前要先判断新传递进来的成员变量与原来的成员变量是否相同,如果不同则释放掉旧的成员变量,如果相同则不release旧的成员变量,也不进行retain。
@property内存管理新特性:
@property一般帮我们自动生成的setter方法是很简单的方法,不能实现内存管理,例如:
-(void)setBook:(Book*) book{_book=book;
}

 

所以我们一般需要自己去实现book的setter方法,例如:
-(void)setBook:(Book *)book{if(_book!=book){[_book release];_book=[book retain];}
}

 

假如我们在某个类里要使用很多个@property 语句去使用类的属性的时候,如果还要自己在.m文件中去写setter方法会很麻烦,所以我们可以这么写:
@property (retain)Book* book;
@property (retain)Card* card;
这里的retain代表:release旧的值,retain新的值
这样相当于我们在.m文件中实现了带有内存管理的setter方法(即上面的代码)
@property的其他参数:默认是(readwrite)属性,同时生成get和set方法
@property(assign)int age;这句跟@property int age等价,@property默认就是assign参数的
@property(readonly)int age;这句表示age是一个只读变量,表示只生成get方法
@property
格式:@property(参数1,参数2) 类型 名字;
参数可有可无,比如:
@property int age;
@property (nonatomic,retain)UIButton* btn;
参数主要分为3类:
读写属性:readwrite/readonly
setter处理:assign/retain/copy
原子性:atomic/nonatomic 
@property属性默认为atomic,提供多线程安全
  • 在多线程环境下,原子操作是必要的,否则就有可能引起错误的结果
  • 加了atomic,setter/getter是一个原子操作。如果有多个线程同时调用setter的话,不会出现某一个线程执行setter全部语句之前,另一个线程开始执行setter的情况,相当于函数头尾加了锁一样
nonatomic代表方法不考虑线程安全问题:
  • nonatomic表示禁止多线程,变量保护,提高性能
  • atomic是OC使用的一种线程保护技术,防止在写入未完成的时候被另外一个线程读取,造成数据错误。而这种机制是耗费系统资源的,所以在iphone这种小型设备上,如果没有使用多线程间的通讯编程,那么nonatomic是一个非常好的选择
  • 如果不需要多线程支持的话,用nonatomic就够了,另外由于不涉及锁操作,所以它执行相对快点
@property的setter处理:
assign:默认类型,setter方法直接赋值,而不进行retain操作
retain:setter方法release旧值,再retain新值
copy:setter方法release旧值,再copy新值(暂时先这么理解,后续会有关于copy语法的新解释
@property的读写属性:
readwrite:产生setter和getter
readonly:只产生简单的getter,没有setter
@property的其他用法:
例如:@property(nonatomic,getter=isRich)BOOL rich;
//getter是用来指定getter方法的方法名,同理setter也可以这样用
自动释放池(autorelease pool)
  • 自动释放池是OC里面的之中内存自动回收机制,一般可以将一些(临时)变量添加到自动释放池中,统一回收释放
  • 当自动释放池销毁时,池里面的所有对象都会调用一次release方法
  • OC对象只需要发送一条autorelease消息,就会把这个对象添加到最近的自动释放池中(栈顶的释放池)
  • autorelease实际上只是把对release的调用延迟了(相当于延迟回收对象),对于每一次autorelease,系统只是把该对象放入了当前的autorelease pool中,当该pool被释放时,该pool中的所有对象会被调用renlease 
复制代码
//autoreleasepool代表创建一个自动释放池
@autoreleasepool{ 
//使用自动释放池:
 
//之前:
 
Book* book =[[Book alloc] init];
 
[student setBook:book];
 
[book release];
 
//现在:
 
Book *book =[[[Book alloc] init] autorelease];
 
[student setBook:book];
 
//不用调用[book release]
}
复制代码

 

静态方法不需要自己释放内存,我们在开发中会经常用到静态方法,因为我们在实现静态方法时,会把变量放到autorelease中这样就不用我们自己去释放内存了
另外:静态方法不能访问对象的成员变量
autorelease pool注意:
  • 在ARC下,不能使用[[NSAutoreleasePool alloc] init],而应当使用@autoreleasepool
  • 不要把大量循环操作放到同一个NSAutoreleasePool之间,这样会造成内存峰值的上升
  • 尽量避免对大内存使用该方法,对于这种延迟释放机制,还是尽量少用
  • sdk中一般利用静态方法创建并返回的对象都是已经autorelease的,不需要再进行release操作,如[NSNumber numberWithInt:10];返回的对象是不需要再release的。但是通过[[NSNumber alloc] initWithInt:10]创建的对象需要release

转载于:https://www.cnblogs.com/hqzxbb/p/4383749.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/297704.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python赋值语句格式_Python赋值语句后逗号的作用分析

Python赋值语句后逗号的作用分析 本文实例讲述了Python赋值语句后逗号的作用。分享给大家供大家参考。具体分析如下: IDLE 2.6.2 >>> a 1 >>> b 2, >>> print type(a)>>> print type(b)>>> c [] >>> d […

.NET 6 中的 Http Logging 中间件

.NET 6 中的 Http Logging 中间件Intro.NET 6 会引入一个 Http logging 的中间件,可以用来帮助我们比较方便记录请求和响应的信息Sample废话不多说,直接来看示例吧var builder WebApplication.CreateBuilder(args);builder.Services.AddControllers(); …

vue限制点击次数_解决vue 按钮多次点击重复提交数据问题

这个其实是一个很细节的问题。 如果我们操作一个按钮,然后在按钮点击的时候绑定事件。事件分为两种情况:•第一种: 不操作数据型•第二种: 操作数据型 点击 这里我们通过控制isDisable 来设置 disabled来控制按钮的点击和不可点击…

Android 开发学习资源

http://www.verycd.com/topics/2892330/http://www.verycd.com/topics/2900036/转载于:https://www.cnblogs.com/chen110xi/archive/2011/12/06/2277493.html

函数的作用域在各浏览器的混乱情况

if(true) {function someFunc(){return 1;};} else {function someFunc(){return 2;};}var notSomeFunc function someFunc(){return 3;};alert(someFunc());FF输出1,表现为存在“块作用域”。 IE6-IE8输出3,这是它处理命名函数表达式时出现bug&#xf…

2020年高考数学试题难吗?历史上最难数学卷不是2003!

全世界只有3.14 % 的人关注了爆炸吧知识不经历风雨怎能知道明天会死得更惨今天,高考拉开大帷幕,数学考试结束的一瞬间,在微博上简直是一片哀嚎今年,延期一个月高考让许多人预测,难度比起非典那一年或许将有增无减&…

深入浅出Docker(三):Docker开源之路

背景 Docker从一开始的概念阶段就致力于使用开源驱动的方式来发展,它的成功缘于国外成熟的开源文化氛围,以及可借鉴的社区运营经验。通过本文详细的介绍,让大家可以全面了解一个项目亦或者一项技术是如何通过开源的方式发展起来的。为了更准确…

android activity解耦,Android与设计模式:用单一职责原则为Activity解耦

一、什么是单一职责原则单一职责原则(SRP:Single responsibility principle)又称单一功能原则,其定义为:一个类,应该只有一个可以导致变化的原因。光看概念一、什么是单一职责原则单一职责原则(SRP:Single responsibil…

python画图程序没有图_python画图 - v0

学了这么多年python了,还一直没有系统地了解过python的画图功能。 每次都是现学现用,但是某些比较紧急的场合,往往就会比较耗时又耗力,因为不成体系,还经常会忘记已经吸纳的新知识。 所以,我决定把这块的画…

利用Azure communication service实现跟Teams同样等级的沟通协作应用

大家都知道Teams是一个非常强大的沟通协作平台,包括聊天,团队协作,会议,以及应用集成等功能,现在在全世界拥有数以亿计的商业用户。作为Teams平台的一个延伸,产品组把一些核心功能变成了一个公开的服务&…

一个入门的学生选课系统

大三的时候写的一个学生选课系统,WinForm 的使用的SQL数据库。主要有学生,老师两类用户,老师查看选择自己课程的学生,学生进行选课(只能选5门课),登陆的时候要有登陆错误次数限制超过会锁定&…

python功能选择模块_python – 组合功能和功能模块

您的compose的实现对于python 3.2是有效的,如上述注释所述.你给出的图书馆的大部分功能都是在documentation中写的python等价物.诸如地图和过滤器的功能已经在python中实现,也可以简单地表示为列表推导. Python有一个id函数返回一个对象的身份(作为整数),但是该库的id函数可以表…

1574: [Usaco2009 Jan]地震损坏Damage

1574: [Usaco2009 Jan]地震损坏Damage Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 425 Solved: 232[Submit][Status][Discuss]Description 农夫John的农场遭受了一场地震.有一些牛棚遭到了损坏,但幸运地,所有牛棚间的路经都还能使用. FJ的农场有P(1 < P < 30,000)…

世界上最诡异的画,到底为何让无数人闻风丧胆?

全世界只有3.14 % 的人关注了爆炸吧知识也许只看到标题 &#xff0c;你一定想不到&#xff0c;传说中世界上最诡异的画是这张。《雨中女郎》这是乌克兰画家斯韦特兰娜捷列茨&#xff0c;绘画生涯中重要的一个作品。也许你会说哪里诡异呢&#xff1f;其实很多人看完这幅画以后&a…

谷歌街景新功能——帮警方抓毒贩

“地球上的毒贩子们&#xff0c;谷歌正在看你们呢。”11月11日的《纽约邮报》在题为《谷歌街景帮忙逮住嫌疑毒贩》的报道开篇这样写道。报道援引执法人员的话说&#xff0c;当时三个毒贩在纽约布鲁克林一处街角向人兜售他们的产品时&#xff0c;被谷歌街景拍个正着。 纽约警介绍…

pixel android8,谷歌Pixel 2更多信息:安卓8.1

给HTC手机团队注入11亿美元现金后&#xff0c;已经显示了谷歌要把硬件做下去的决心&#xff0c;特别是自家的Pixel系列&#xff0c;而10月4日新一代Pixel手机将正式来袭。据Android Police最新报道称&#xff0c;谷歌新的Pixel 2代手机将会提供一个新的功能名叫Always-On Song …

tftp 服务器 ip_360Stack裸金属服务器部署实践

女主宣言裸金属特性是一种将物理设备作为资源提供给租户的云计算服务&#xff0c;租户通过该服务可申请、管理和配置相应的物理设备资源&#xff0c;本文将介绍360Stack裸金属服务器的部署实践。PS&#xff1a;丰富的一线技术、多元化的表现形式&#xff0c;尽在“360云计算”&…

设计模式:状态模式

一、引子 状态模式自身结构非常简单——前面刚刚介绍了几个结构比较简单的设计模式&#xff0c;和他们 一样&#xff0c;状态模式在具体实现上留下了可变换的余地。我前面已经介绍过它的孪生兄妹策略模 式了&#xff0c;大家可以两者比较着阅读。本文将会讨论两者的区别。 二、…

python柱状图挨在一起_echarts多个柱状图展示问题(bar都挤到一起了)

设置bar的宽度也不行&#xff0c;增加区间长度也不行展示是这种情况附上option对象{"calculable": true,"dataZoom": [{"end": 50,"show": true,"start": 2,"type": "slider","xAxisIndex": …

织梦首页html在哪儿,dedecms织梦首页去index.html

如果首页中有index.html不利于SEO&#xff0c;蜘蛛用主域名跟踪到你网站的时候结果多了个index.html&#xff0c;结果导致分散了权重解决方法&#xff1a;将根目录下的index.php文件更改为&#xff1a;if(!file_exists(dirname(__FILE__)./data/common.inc.php)){header(Locati…