object-c(oc)内存管理机制详解
1.内存的创建和释放
让我们以Object-c世界中最最简单的申请内存方式展开,谈谈关于一个对象的生命周期。首先创建一个对象:
1
2
3
|
//“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(retain),@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,该创建的仍创建,该释放的仍释放。
http://www.cnblogs.com/haibosoft/p/3656290.html
object-c(oc)内存管理机制详解的更多相关文章
- ARC内存管理机制详解
ARC在OC里面个人感觉又是一个高大上的牛词,在前面Objective-C中的内存管理部分提到了ARC内存管理机制,ARC是Automatic Reference Counting---自动引用计数. ...
- OC 内存管理机制总结
OC 内存管理机制总结 一:OC内存管理机制目前分为两块,其一自动内存管理机制,其二手动内存管理机制: 1.首先我们从自动内存管理机制讲起: 1)什么是自动内存管理机制,自动内存管理机制就是程序中所创 ...
- IOS中内存管理机制浅解
我们知道在程序运行过程中要创建大量的对象,和其他高级语言类似,在ObjC中对象时存储在堆中的,系统并不会自动释放堆中的内存(注意基本类型是 由系统自己管理的,放在栈上).如果一个对象创建并使用后没有得 ...
- Redis 内存淘汰机制详解
一般来说,缓存的容量是小于数据总量的,所以,当缓存数据越来越多,Redis 不可避免的会被写满,这时候就涉及到 Redis 的内存淘汰机制了.我们需要选定某种策略将"不重要"的数据 ...
- go - 内存分配机制详解
一般程序的内存分配,从高位到低位依次为 全局静态区:用于存储全局变量.静态变量等:这部分内存在程序编译时已经分配好,由操作系统管理,速度快,不易出错. 栈:函数中的基础类型的局部变量:由程序进行系统调 ...
- ucos内存管理原理详解
应用程序中为了某种特殊需要,经常需要动态的分配内存,而操作系统的特质置一,就是能不能保证动态内存分配的时效性,也就是说分配时间是可确定的 Ucos提供内存分配功能,它将内存空间分为两级管理,将一块连续 ...
- mybatis事务管理机制详解
1.mybatis事务的配置和使用 mybatis事务有两种使用方式: (a):使用JDBC的事务管理机制:即使用java.Sql.Connection对象完成对事务的提交,回滚和关闭操作. (b): ...
- iOS- 非ARC的项目内存管理细节详解(实战)
1.前言 接上文:iOS- 如何将非ARC的项目转换成ARC项目(实战) 2.内存管理时相关的配置 当我们把将非ARC的内存管理都管理好后,发现在做有些操作的时候内存还是在一直的缓慢增加 比如做一个最 ...
- Android开发——Android 6.0权限管理机制详解
.Android 6.0运行时主动请求权限 3.1 检测和申请权限 下面的例子介绍上面列出的读写SD卡的使用例子,可以使用以下的方式解决: public boolean isGrantExterna ...
随机推荐
- JS 之DOM range对象
DOM范围 DOM中的range对象是DOM2中新定义的接口.通过这个对象可以选择文档中的某个区域,而不必考虑节点的界限. 创建范围 document.createRange()创建一个范围,这个范围 ...
- Caffe学习系列(11):图像数据转换成db(leveldb/lmdb)文件
在深度学习的实际应用中,我们经常用到的原始数据是图片文件,如jpg,jpeg,png,tif等格式的,而且有可能图片的大小还不一致.而在caffe中经常使用的数据类型是lmdb或leveldb,因此就 ...
- LeetCode 笔记27 Two Sum III - Data structure design
Design and implement a TwoSum class. It should support the following operations: add and find. add - ...
- 让PowerShell用上Git
废话 废话一下为什么要在PowerShell上使用Git,有一些项目在公司要开发,回到家了忽然有灵感想要写一写,这个时候将代码托管到网上是最为方便,我所使用的开发工具是vs2013,自然而然想到使用T ...
- 详解SpringMVC中Controller的方法中参数的工作原理[附带源码分析]
目录 前言 现象 源码分析 HandlerMethodArgumentResolver与HandlerMethodReturnValueHandler接口介绍 HandlerMethodArgumen ...
- Java中的String、StringBuffer以及StringBuilder的用法和区别
String String的构造方式有n种(据说n==11),常见的例举一二: String s1 = "hello world"; String s2 = new String( ...
- IText&Html2canvas js截图 绘制 导出PDF
Html2canvas JS截图 HTML <div id="divPDF"> 需要截图的区域 </div> JS <script src=" ...
- vs2015发现一个字符串拼接 bug
VS2015支持 字符串拼接 如下: string user="test"; int password=123; string sql=$" user={user};pa ...
- AutoTest简介
前言(仅看介绍本身的可以略过) 在离职后的一段时间里,个人总结了过去几年工作的心得,结合以往的工作经验.重新思考并重构了前些年做的一些东西(主要是测试相关),产生了设计AutoTest这样的一个测试工 ...
- Android学习第八弹之改变状态栏的颜色使其与APP风格一体化
公众号:smart_android 作者:耿广龙|loonggg 点击"阅读原文",可查看更多内容和干货 导语:沉浸式状态栏,改变状态栏的颜色使之与APP风格一体化是不是感觉很漂亮 ...