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 […

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

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

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

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

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

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

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

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

一个入门的学生选课系统

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

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

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

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

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

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

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

设计模式:状态模式

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

Google Chrome 总提示flash插件过期,用命令行模式解决

目标那改成:"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --args --allow-outdated-plugins chrome老提示插件已被阻止: chrome://plugins/ 进入插件 选择始终允许转载于:https://www.cnblogs.com/as3lib/p/4396418.html

Windows下的gcc/gc++编译环境配置

最近有很多算法设计的网络大赛,其中大部分的C/C都是采用Linux下的GCC/G编译器。配置GCC编译器大概有这几种途径:装Linux系统、装Linux虚拟机或者在Windows环境下模拟Linux编译环境。这里谈谈有关Windows下模拟Linux编译环境的方法。 说到Windows下模拟Li…

程序员苦逼了6年,选择在街边做鸭......

1 从入门到转行可太真实了▼2 干干巴巴,麻麻赖赖给我盘!▼3 这位高人一看就是本科蓝翔,新东方硕博连读▼4 主要还是男人比较自信▼5 逻辑清晰,思维缜密▼6 妈妈,我就想听好听的▼7 如过全网都没有广告说不定会有…

Resharper 和 Rider 的奇淫技巧,你知道多少?

.NET 开发中最令人印象深刻的生产力工具之一是ReSharper[1]。每次发布时,我都对它的功能感到震惊。不要误会我的意思,我喜欢 Visual Studio,而且它也变得越来越好。但每当我认为 Visual Studio 迎头赶上时,我就会发现一些令人惊叹…

流量节省模式 Android,这三种方法让你节省更多手机上网流量

大多数手机用户应该都知道最基本的流量管理方式——没有Wi-Fi可用时就不看视频、不玩在线游戏、或者下载大型应用——除非你拥有不限流量套餐。但如果你在使用流量时已经很节约,但每个月的用量依然会超出流量套餐,那下面这三种方法应该可以确保你不会浪费…

PS比狠大赛!看看谁家的照片更丑!

全世界只有3.14 % 的人关注了爆炸吧知识最近在网上看到一个“丑照片挑战”本来以为就是丑吧结果一看惊了张张都是文艺大片范儿一点都不丑至于为什么叫丑照片挑战赛来看看他们的实拍背景就知道了比如第一张小姐姐的酷拽镜头靠的竟然是餐桌上这盆小绿植第二张的帅气小哥哈哈哈对不…

.NET 6 数组拷贝性能对比

本文来对比多个不同的方法进行数组拷贝,和测试其性能测试性能必须采用基准(标准)性能测试方法,否则测试结果不可信。在 dotnet 里面,可以采用 BenchmarkDotNet 进行性能测试。详细请看 C# 标准性能测试拷贝某个数组的从…

python win32ui选取文件夹_最全 Python 算法实现资源汇总!

整理 | Rachel责编 | Jane出品 | Python大本营(ID:pythonnews)【导语】数据结构与算法是所有人都要学习的基础课程,自己写算法的过程可以帮助我们更好地理解算法思路,不要轻视每一个算法,一些虽然看似容易,但可能有很多…

兄弟,就你这智商就别出轨了吧?

1 这智商就别出轨了吧(没有聪明人就能出轨的意思)▼2 “俗话说得好”上一句是什么?▼3 这是什么诡异的老年运动?▼4 搞不懂时尚趋势在哪里.....▼5 聚餐的时候千万别拿着包去厕所▼6 一看就会一学就废▼7 聪明的狗子能有多…

requestmapping注解访问404_【框架】127:几个非常重要的注解

今天是刘小爱自学Java的第127天。感谢你的观看,谢谢你。今天的知识点有点多,有点记不过来了。学习内容安排如下:使用注解优化昨天写的springMVC入门程序。映射路径各种风格的学习,也就对应了注解RequestMapping中的参数。各种类型…