oc对象的内存管理
oc没有java的垃圾回收机制,所以对象的内存释放很重要,基本数据类型,我们不用理会,编译器会处理;
oc的每个对象内部都由一个计数器,用来记录当前有几个指针在指向该对象;当计数器为0时该对象会从内存中释放;
相关方法和概念:
1:retain:对象方法,调用该对象方法,计数器+1,有返回值,返回对象本身;
2:release:没有返回值,计数器-1;
3;retainCount:获取当前计数器的值;
4:dealloc:当对象被回收时,就会调用该方法,覆盖该方法时一定要调用[super dealloc],且放在最后;释放的顺序一般是先释放子类再释放父类;
注:arc环境下不用调用[super dealloc]
概念:
1:僵尸对象:内存已经被回收的对象,僵尸对象是不能在使用的,
2:野指针:指向了僵尸对象(不可用内存)的指针;给野指针发消息会报错:EXE_BAD_ACCESS
3:空指针:没有指向任何对象的指针:值为0、nil、null;给空指针发消息不会报错;
多对象内存管理:
内存管理核心思想:一般来说,类方法:alloc是在堆中开辟空间的,调用了alloc,计数器会+1;所以一旦写了alloc,一定要写release;同样调用了retain,一定要调用release;
当对象较多时,对象之间的组合关系很容易让我们忽视掉了,这个对象的指向者有几个;所以规范严格的写好setter方法和dealloc方法;
内存管理代码规范总结:
1:只要调用了alloc,必须有release(autorelease)
2:setter的规范写法:
*:如果是基本数据类型,则和平常一样;
*:如果成员变量是对象,也就是组合关系时,比如Person拥有一辆Car;那么Car的setter:
- (void)setCar:(Car *)car
{
// 首先判断传入的car是否和存在的car是同一个
if(_car != car)
{
// 先释放以前的car
[_car release];
// 在赋值 ,一定先对新的car做一次retain
_car = [car retain];
}
}
3:dealloc方法的代码规范:
*:对self (当前) 拥有的其他对象执行一次release
*:一定要调用父类的dealloc [super dealloc],且要放到最后边;
- (void)dealloc
{
// 对当前对象的其他对象release
[_car release];
[super dealloc];
}
oc对象的内存管理的更多相关文章
- oc-31-多对象的内存管理
在每个OC对象内部,都专门有8个字节的存储空间来存储引用计数器. 引用计数器的常见操作 retain消息:堆内存中对象的计数器变量 +(该方法返回对象本身,要想计数器变量加1就要调用对象的retain ...
- OC学习10——内存管理
1.对于面向对象的语言,程序需要不断地创建对象.这些对象都是保存在堆内存中,而我们的指针变量中保存的是这些对象在堆内存中的地址,当该对象使用结束之后,指针变量指向其他对象或者指向nil时,这个对象将称 ...
- OC开发系列-内存管理
概述 移动设备的内存极其有限,每个app所有占用的内存是有限的.当app所占用的内存比较多时,系统会发出内存警告,这时得回收一些不需要再使用的内存空间. 任何集成了NSObject的对象都需要手动进行 ...
- Objective-C之集合对象的内存管理
*:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...
- block没那么难(三):block和对象的内存管理
本系列博文总结自<Pro Multithreading and Memory Management for iOS and OS X with ARC> 在上一篇文章中,我们讲了很多关于 ...
- Java进阶2 数组内存和对象的内存管理知识
Java进阶2 数组内存和对象的内存管理知识 20131028 前言: 在面试的时候,如果是Java的编程语言,也许你认为没有什么可以问的,只能够说明你对于Java了解的太浅了,几乎就是两个星期的节奏 ...
- oc56--ARC多个对象的内存管理
// main.m // ARC中多个对象的内存管理:ARC的内存管理就是MRC的内存管理(一个对象释放的时候,必然会把它里面的对象释放),只不过一个是Xcode加的代码,一个是我们自己加的代码: / ...
- OC中的内存管理
一. 基本原理 1. 什么是内存管理 移动设备的内存极其有限,每个app所能占用的内存是有限制的 当app所占用的内存较多时,系统会发出内存警告,这时得回收一些不需要再使用的内存空间.比如回收一些不需 ...
- OC修饰词 - 内存管理
<招聘一个靠谱的 iOS>—参考答案(上) 说明:面试题来源是微博@我就叫Sunny怎么了的这篇博文:<招聘一个靠谱的 iOS>,其中共55题,除第一题为纠错题外,其他54道均 ...
随机推荐
- 第一章 响应式设计之Media Quer
书里谈到尽量不要使用Media Queriy. 但是过多使用media query,会导致CSS变得脆弱和页面难以维护.一些方法可以减少页面使用 media query. 响应式设计: (1) 使用百 ...
- SQL的内连接与外连接
转自:http://blog.csdn.net/killerggf/article/details/6216102 有两个表A和表B. 表A结构如下: Aid:int:标识种子,主键,自增ID ...
- Set集合——HashSet、TreeSet、LinkedHashSet(2015年07月06日)
一.Set集合不同于List的是: Set不允许重复 Set是无序集合 Set没有下标索引,所以对Set的遍历要通过迭代器Iterator 二.HashSet 1.HashSet由一个哈希表支持,内部 ...
- oracle中的instr()
INSTR (源字符串, 目标字符串, 起始位置, 匹配序号) 在Oracle/PLSQL中,instr函数返回要截取的字符串在源字符串中的位置.只检索一次,就是说从字符的开始 到字符的结尾就结束. ...
- 学习Slim Framework for PHP v3 (三)
继续上一篇的问题,如何动态的添加不同的Module.添加Module是给Middleware用的,用于调用Module的写日志方法.上篇中的写法是在app->add(mv),这时的middlew ...
- AspNetPager用法
最近在做数据管理系统的开发工作,遇到数据表中记录过多的问题,虽然asp.net中已有分页控件,但是非常简陋.AspNetPager是一款非常强大的分页控件,它的介绍我这里就不在赘述了,网上有很多它的介 ...
- yarn.resourcemanager.ha.id设置
resourcemanager启动报错,其中一个启动成功,另一个启动报8088端口被成功启动的rm占用 2016-11-18 17:08:49,478 INFO org.apache.zookeepe ...
- log4Net 简单配置实用
<configSections> <section name="log4net" type="log4net.Config.Log4NetConfigu ...
- MySQL中DATE_FORMATE函数内置字符集解析
今天帮同事处理一个SQL(简化过后的)执行报错: 代码如下 复制代码 mysql> select date_format('2013-11-19','Y-m-d') > timediff( ...
- CoreAnimation 核心动画一 (一些常用属性 和 方法)
1.常用属性: frame bounds center alpha Transition 过渡 transform 动画效果 2.常用方法: +(void)setAnimati ...