Objective-C内存管理,基本原理。

  1.为什么要进行内存管理?

  由于移动设备的内存极其有限,所以分配每个APP使用的内存也是有限制的,app运行时内存占用较多的话,系统就会发出内存警告,严重时会强制关闭app.

  本质原因是因为对象和其他数据类型在系统中的存储空间不一样,其它局部变量主要存放于栈内存中,而对象存储于堆内存中,当代码块结束时这个代码块中涉及的所有局部变量会被回收,指向对象的指针也被回收,此时对象已经没有指针指向,但依然存在于内存中,造成内存泄露。

  2.对象的基本结构

  每个Objective-C对象都有引用计数器(专门有4个字节的存储空间来存储),是一个整数表示对象被引用的次数,即现在有多少东西在使用这个对象。对象刚被创建时,默认计数器值为1,当计数器的值变为0时,则对象销毁。

  3.引用计数器的作用

  判断一个对象是否要被回收的依据就是看计数器的值是否为0,若为0则销毁

  4.引用计数器操作

  [object retain]:使object计数器+1

  [object release]:使object计数器-1

  [object retainCount]:获得object引用计数器值

  5.对象的销毁

  当object的引用计数器为0时,那么object将被销毁,object占用的内存被系统回收。当object被销毁时,系统会自动向object发送一条dealloc消息,一般会重写object的dealloc方法,在这里释放相关的资源,重写了dealloc方法就必须在代码块的最后调用[super dealloc],随后object存储空间被回收,记住不要手动向object 发送dealloc消息!

Objective-C内存管理原则

  1.谁创建,谁release

  如果你通过alloc,new,copy来创建了一个对象,那么你就必须调用release或者autorelease方法。不是你创建的就不用你去负责。

  2.谁retain,谁release

  只要你调用了retain,无论这个对象时如何生成的,你都要调用release

  3.有始有终,有增有减,增减平衡

Objective-C内存管理代码规范

  1.只要调用了alloc,new,copy,就必须有release(autorelease)

  2.重写dealloc方法一定要在最后调用[super dealloc];

@property的参数相关

@property (nonatomic, assign) int age;
@property (nonatomic, retain) NSString *name;

@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对于性能的损失相对较大

本站文章为宝宝巴士 SD.Team原创,转载务必在明显处注明:(作者官方网站:宝宝巴士
转载自【宝宝巴士SuperDo团队】 原文链接: http://www.cnblogs.com/superdo/p/4542926.html

[Objective-C] 003_内存管理的更多相关文章

  1. Objective C内存管理之理解autorelease------面试题

    Objective C内存管理之理解autorelease   Autorelease实际上只是把对release的调用延迟了,对于每一个Autorelease,系统只是把该Object放入了当前的A ...

  2. Objective -C Memory Management 内存管理 第一部分

    Objective -C Memory Management  内存管理  第一部分 Memory management is part of a more general problem in pr ...

  3. Objective C 内存管理[转]

    1  配对原则 alloc – release new – release retain - release copy – release 2  new和alloc-init的区别 (1)区别只在于a ...

  4. Objective-C(内存管理)

    引用计数器 每个OC对象都有一个占4个字节存储空间的引用计数器 当使用或创建一个对象时,新对象的引用计数器默认是1 retain:可以使引用计数器+1 release:可以是引用计数器-1 retai ...

  5. objective C 内存管理及属性方法具体解释

    oc为每一个对象提供一个内部计数器.这个计数器跟踪对象的引用计数,当对象被创建或拷贝时.引用计数为1.每次保持对象时,调用retain接口.引用计数加1.假设不需要这个对象时调用release,引用计 ...

  6. IOS学习笔记3—Objective C—简单的内存管理

    今天简述一下简单的内存管理,在IOS5.0以后Apple增加了ARC机制(Automatic Reference Counting),给开发人员带来了不少的方便,但是为了能更好的理解IOS内存管理机制 ...

  7. objective-c(内存管理)

    本文主要记录objective-c 内存管理的知识点: 1.objective-c的对象都是分配内存在堆上,与C的mallock和C++的new类似,只有int等系统变量分配内存在栈上: 2.obje ...

  8. iOS学习17之OC内存管理

    1.内存管理的方式 1> iOS应用程序出现Crash(闪退),90%的原因是因为内存问题. 2> 内存问题 野指针异常:访问没有所有权的内存,如果想要安全的访问,必须确保空间还在 内存泄 ...

  9. iOS - OC 内存管理

    1.OC 基本内存管理模型 1.1 自动垃圾收集 在 OC 2.0 中,有一种称为垃圾收集的内存管理形式.通过垃圾收集,系统能够自动监测对象是否拥有其他的对象,当程序执行需要空间的时候,不再被引用的对 ...

随机推荐

  1. 深度学习环境搭建:window10+CUDA10.0+CUDNN+pytorch1.2.0

    去年底入手一台联想Y7000P,配置了Nvidia GeForce GTX 1660 Ti GPU,GPU内存6G,但是因为有GPU服务器,所以一直没有在这台笔记本上跑过模型,如今经过一番折腾,终于在 ...

  2. 数据库——数据库SQL语句大全,最常用的SQL语句

    检索数据 检索单个列: SELECT pname FROM product 检索多个列: SELECT pname,market_price,is_hot FROM product 检索所有列: SE ...

  3. B - Save the problem! CodeForces - 867B 构造题

    B - Save the problem! CodeForces - 867B 这个题目还是很简单的,很明显是一个构造题,但是早训的时候脑子有点糊涂,想到了用1 2 来构造, 但是去算这个数的时候算错 ...

  4. T - zxa and leaf HDU - 5682 二分+dfs

    T - zxa and leaf HDU - 5682 题目大意是:给你一颗树,这棵树有些节点已经设置了它的美丽值,然后剩下一些节点需要我们设置美丽值. 一条边的丑陋程度等于被定义为由这个边缘连接的两 ...

  5. Re模块的 三个方法

    import re s1 = '绿茶白茶黄茶青茶红茶黑茶' s2 = '中国绿茶白茶黄茶青茶红茶黑茶' ret = re.findall(".茶", s1) print(ret) ...

  6. Collection接口【集合】和Iterator迭代器类

    1.1集合的概述 前面基础学习并使用过集合ArrayList<E>,那么集合究竟是什么呢? 集合:集合是Java中提供的一种容器,可以用来存储多个数据. 那么意思就是说集合是容器,但是容器 ...

  7. 【Scala】Actor并发编程实现单机版wordCount

    文章目录 对单个文本文件进行单词计数 对多个文本文件进行单词计数 对单个文本文件进行单词计数 import scala.actors.Actor import scala.io.Source //读取 ...

  8. ubuntu上lib-ace库安装编译

    描述下本人电脑情况: 虚拟机版本:VMware-workstation-full-v7.1.4: ACE版本:ACE6.0.0 虚拟机[Linux](http://lib.csdn.net/base/ ...

  9. P2220 [HAOI2012]容易题(快速幂)

    Describe 为了使得大家高兴,小Q特意出个自认为的简单题(easy)来满足大家,这道简单题是描述如下: 有一个数列A已知对于所有的A[i]都是1~n的自然数,并且知道对于一些A[i]不能取哪些值 ...

  10. JS插件:fullCalendar图解

    1.首先看下效果: 官网下载链接 https://fullcalendar.io/download .官方效果图:https://fullcalendar.io/ 2.准备工作,引入对应的 css和 ...