object-c 内存管理机制的学习
1.内存的创建和释放
让我们以Object-c世界中最最简单的申请内存方式展开,谈谈关于一个对象的生命周期。首先创建一个对象:
//“ClassName”是任何你想写的类名,比如NSString NSArray等一切随意
id testObject = [[ClassName alloc] init];
注: alloc 是object-c 中常用来申请内存块的方式
此时,对于对象“testObject”来说,他的引用计数就是1了,原因就是他调用了alloc来创建了一块只属于他的内存,这样对象的引用计数就得+1. 另外,Object-c中的另两个关键字retain和copy也会将对象的引用计数+1.根据Object-c的内存管理机制,我们在使用完“testObject”后,需要释放它。
[testObject release];
release后的对象,虽然已经释放,但是他的指针地址仍然存在,只是指向了一块已经释放且无用的内存,所以我们建议release后直接赋个nil来置空。
一般,如果我们能知道需要实现功能所涉及的“className”的具体类名,就不建议使用init方法去初始化,比如以下代码:
NSString *strTest=[[NSString alloc] initWithString:@"test"]; (推荐)
NSString *strTest=[[NSString alloc] init]; (不推荐)
2.类方法和实例方法
简单来说,实例方法就是得有了具体实例(对象)后才能使用的方法,一般以减号形式作为方法的前缀来声明,比如API定义
-(id)initWithString:(NSString *)aString;
相比而言,类方法则无需具体对象,只需要类的名称即可调用,一般以加号形式作为方法的前缀来声明,比如API定义:
+(id)stringWithString:(NSString *)aString;
大可以将类方法理解为静态方法,类方法在对象还没创建出来之前已经有了。
3.属性关键字
@property (nonatomic, assign) int B;
@property (nonatomic, retain) id classObj;
可以看到关键之@property后的括号出现了四个特征性关键字:nonatomic , assign , retain , settet, 这些关键字直接告诉编译器后面的变量用何种方式来存取。
属性关键字 | 使用范围 | 释义 | 是否时默认值 | 小贴士 |
assign | 赋值方式 | 不复制不保留,直接赋值 | YES |
基本数据类型和本类不直接拥有的对象 |
retain | 赋值方式 | 将新值保留一份赋覆盖原值 | NO | 大部分对象可使用 |
copy | 赋值方式 | 将新值复制一份赋覆盖原值 | NO | 字符串选择性使用 |
readwrite | 读写权限 | 生成getter和setter两个方法 | YES | 变量可读取可修改 |
readonly | 读写权限 | 只生成getter方法 | NO | 变量只读不可修改 |
atomic | 原子性 | 原子操作 | YES | 可以保留在多线程环境下,能安全的存取值 |
nonatomic | 原子性 | 非原子操作 | NO | 不生成多线程同步内容 |
getter | 存取方法 | 自定义取方法 | NO | |
setter | 存取方法 | 自定义赋值方法 | NO |
关于nonatomic,如果我们能确定不需要多线程访问时,强烈推荐使用这个关键字,因为atomic对于性能的损失相对较大
如果是类的delegate,推荐使用assign关键字,原因是避免了retain的死循环造成的对象无法真正的释放
3.ARC新增关键字
ARC新增两个武功高强的左右护法:strong 和 weak
strong的含义和retain相同,weak和assign相同,修饰完的属性变量用法也是完全没有改变,不过strong和weak只能修饰对象。
苹果官方对于ARC机制中对象的内存引用规则:
(1)任何对象,如果仍有持有者,就不会销毁
(2)任何对象,已经没有任何持有者,即自动销毁
持有者就是只想对象的指针,如果是strong修饰的,即是对象的持有者,如果是weak属性的,则不是持有者
4.ARC机制的使用规则
对于ARC机制的使用,苹果发布了几条重要的规则需要开发者遵守。单单看那些生搬硬套的东西难免生涩,根据开发经验将规则总结如下:
(1)不能调用dealloc,不能重写和调用retain,release,retainCount 和autorelease,同理,@selector(retina),@selector(release)这些曲线救国的方法也不能调用。dealloc虽然能够重写,但是不能调用[super dealloc]之类的方法,CoreFoundation框架由于非从属cocoa框架,所以CFRetain和CFRelease仍然正常使用。
(2)不能使用NSAllocateObjec或NSDeallocateObject函数来创建对象
(3)不能在C语言的结构体中使用对象指针,同时建议用object-c的类来管理数据而不是结构体
(4)不得使用NSAutoreleasePool对象。ARC中,全部使用@autorelease关键字代替,且比NSAutoreleasePool更高效
(5)不得使用内存Zone,那些牵涉NSZone的方法都不得使用。
(6)不得对一个属性变量的取值方法命名以new开头
(7)outlet均用weak关键字修饰,除非他是xib中最顶部的界面元素,则需要strong。
(8)Core Foundation不适合ARC,该创建的仍创建,该释放的仍释放。
object-c 内存管理机制的学习的更多相关文章
- 12.Object-C--浅谈OC的内存管理机制
昨天学习了OC的内存管理机制,今天想总结一下,所以接下来我要在这里bibi一下:OC的内存管理. 首先我要说的是,内存管理的作用范围. 内存管理的作用范围: 任何继承了NSObject的对象,对其他基 ...
- 深入了解C#系列:谈谈C#中垃圾回收与内存管理机制
今天抽空来讨论一下.Net的垃圾回收与内存管理机制,也算是完成上个<WCF分布式开发必备知识>系列后的一次休息吧.以前被别人面试的时候问过我GC工作原理的问题,我现在面试新人的时候偶尔也会 ...
- 【Cocos2d-x 3.x】内存管理机制与源码分析
侯捷先生说过这么一句话 : 源码之前,了无秘密. 要了解Cocos2d-x的内存管理机制,就得阅读源码. 接触Cocos2d-x时, Cocos2d-x的最新版本已经到了3.2的时代,在学习Coco ...
- C#中垃圾回收与内存管理机制
今天抽空来讨论一下.Net的垃圾回收与内存管理机制,也算是完成上个<WCF分布式开发必备知识>系列后的一次休息吧.以前被别人面试的时候问过我GC工作原理的问题,我现在面试新人的时候偶尔也会 ...
- Python深入之python内存管理机制(重点)
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:醍醐三叶 关于python的存储问题, (1)由于python中 ...
- (重点)Python深入之Python内存管理机制你会吗?
前言本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理.作者:醍醐三叶 请注意:如果你平时学Python遇到问题找不到人解答?或者没有 ...
- 深入理解Java虚拟机(自动内存管理机制)
文章首发于公众号:BaronTalk 书籍真的是常读常新,古人说「书读百遍其义自见」还是很有道理的.周志明老师的这本<深入理解 Java 虚拟机>我细读了不下三遍,每一次阅读都有新的收获, ...
- Java虚拟机内存管理机制
自动内存管理机制 Java虚拟机(JVM)在执行Java程序过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有的区 ...
- cocos2dx的内存管理机制
首先我们必须说一下c++中变量的内存空间的分配问题,我们在c++中写一个类,可以在栈上分配内存空间也可以使用new在堆上分配内存空间,如果类对象是在栈上分配的内存空间,这个内存空间的管理就不是我们的事 ...
随机推荐
- 同一TextView上内容的不同显示
首先请原谅我不会给文章起名字. . .不能准确的表达出究竟要讲什么,真实智商捉急. 直接上图 如图所看到的显示的是两个textview 第一个实现的是,在同一个textview中给不同内容赋予不同的颜 ...
- 数学题(找规律)-hdu-4371-Minimum palindrome
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4731 题目大意: 给一个n表示有n种字母(全部小写),给一个m,求一个由不超过n种字母组成的m个小写 ...
- UML的基本图(一)
A class diagram shows a set of classes, interfaces, and collaborations and their relationships. T ...
- js 全局函数
全局函数与内置对象的属性或方法不是一个概念. 全局函数它不属于任何一个内置对象. JS中有14个全局函数 函数 描述 decodeURI() 解码某个编码的 URI. decodeURICompone ...
- MongoDB 启动异常
今天启动MongoDB遇到异常状况 mongodb warning: 32-bit servers don't have journaling enable 解决方法: 删除数据库目录的.lock文件 ...
- JavaScript之call()和apply()方法详解
简介:apply()和call()都是属于Function.prototype的一个方法属性,它是JavaScript引擎内在实现的方法,因为属于Function.prototype,所以每个Func ...
- Android - 不管在应用的哪个activity按Home键整个App就结束了
最开始,客户反映说在用app的时候,来个电话,接完再点app,不是原来的界面,而是重启了.数据都没了,所以就在activity重写onSaveInstanceState方法,将数据保存起来.后经测试发 ...
- 桦仔 笔记4-徐 模仿灾难发生时还原adventurework数据库 示例 stopat
1 --模仿灾难发生时还原adventurework数据库 示例 stopat 2 3 BACKUP DATABASE AdventureWorks 4 TO DISK= 'D:\MSSQL\Data ...
- js 下拉框效果
<script type="text/javascript"> window.onload = function () { ]; ]; var aLi = oSub.g ...
- for循环计算某个数的阶乘、阶乘和及其倒数的阶乘和
//4的阶乘 int jc = 4; //定义一个变量用来代表要计算的数值 long jd =1; //定义最终输出的阶乘 for(int i = 1; i <= jc;i++) //定义循环加 ...