OC第三天(内存管理)
内存管理:
1.作用范围:
不论什么继承了NSObject的对象,堆基本数据类型无效如:int
a ,float price;;等
2.原理:
每一个对象内部都保存了一个与之相关的整数,称为引用计数器,
当使用alloc
new
copy创建一个对象的时候,对象的引用计数器被设置为1
每给对象发送一次retain消息。能够使引用计数器+1;
给对象发送一条release消息。能够使引用计数器-1;
当一个对象的引用计数器为0时,那么它将被销毁。其占用的内存被系统回收,OC也会自己主动向对象发送一条dealloc消息,通常会重写dealloc方法,在这里,释放相关资源,一定不要直接调用dealloc方法:
能够给对象发送retaincount消息。获得当前的因数计数器数值。
3.retain
和release
:
1。假设你想知道一个对象是不是被回收,方法:重写父类的dealloc方法:
注意:一定要调用super的dealloc方法,并且最后放在最后面调用。
([super
dealloc ])
2.假设一个对象调用了release
的操作。而且他的引用计数器已经为0。假设你再次调用他的release方法:这时候就会发生野指针错误:
野指针错误:你调用了本不属于你的内存空间,你既然已经释放了本来你的内存,那么如今那块内存已经不属于你了。你在调用release方法。说明你又声明那块内存是属于你的,这时候就会发生野指针
错误。
注意:当一个对象retain为0的时候。这时候你就不能再调用他的retainCound方法。由于一个被释放的对象,没有内存。不再去进行訪问会发生野指针错误。
3.假设你在创建对象的时候。加上autorelease,那么编译器会在一个适当的时机释放对象,这
样就不须要你自己手动释放对象的内存了
4.内存管理法则:
1.谁创建,谁释放(“谁污染,谁治理”),假设你通过alloc
,new ,copy来创建一个对象。那么你必须调用release或autorelease
,假设不是你创建的。你就不用去释放。
2.一般除了alloc
,new copy之外的方法创建的对象都被声明了autorelease
3.谁retain
,谁release
,仅仅要你调用了retain
,不管这个对象是怎样产生的,你都要调用release;
5.对象之间的内存管理:
前提:假设一个类A作为另外一个类B的成员变量。而且訪问A的数据成员的是否。假设在main函数中调用了类B的一个方法,这时候会调用A的对象进行初始化A的成员变量,当在该方法中销毁后。类B又訪问了一个方法2,这时候仍然让类A的对象进行初始化操作。这时候会出现野指针错误,
原因:因为在方法1中已经释放了A对象,所以A对象所指向的成员变量的内存回收,假设你再进行调用。就会指向一个不属于自己的内存空间,这是非常危急的。
解决的方法。在set方法里里面设施对象的retain操作。并进行release。前提。是推断传进来的对象是不是本身。假设是本身那就释放掉原来对象的指向,假设是一个新的,那就没有必要进行release,由于,新对象本来计数器为0.你再release,就会错误。
代码例如以下:
类B
中的.M文件
- (id)initWithAge:(int)age{
if ( self= [super
init]) {
_age = age;
}
return self;
}
#pragma mark
回收对象
- (void)dealloc {
// 释放Book对象
[_book
release];
//[self.book release];
NSLog(@"student:%i被销毁了",
_age);
[super
dealloc];
}
#pragma mark - getter和setter
- (void)setBook:(Book*)book {
if (_book!= book) {
// 先释放旧的成员变量
[_book
release];
// 再retain新传进来的对象
_book = [book retain];
}
}
- (Book *)book {
return _book;
}
#pragma mark -
公共方法
#pragma mark
读书
- (void)readBook {
NSLog(@"当前读的书是:%f",
_book.price);
}
main函数:
void test(Student*stu) {
// book:1
引用计数器
Book *book = [[Book
alloc] initWithPrice:3.5];
// book:2
stu.book = book;
// book:1
[book
release];
//book2:1
Book *book2 = [[Book
alloc] initWithPrice:4.5];
//book2:2
stu.book = book2;
// book2:2
stu.book = book2;
// book2:1
[book2
release];
// book2:1
stu.book = book2;//假设再次调用,book2的retaiin也不会变
}
void test1(Student*stu) {
[stu
readBook];
}
int main(intargc,
const char* argv[])
{
@autoreleasepool {
// stu:1
Student *stu = [[Student
];
// stu:1
//book:1
//book2:1
test(stu);
// stu:1
//book:1
//book2:1
test1(stu);
// stu:0
//book2:0
//book:1
[stu
release];
}
return ;
}
OC第三天(内存管理)的更多相关文章
- memcache(三)内存管理
memcached(三)内存管理 memcached使用预申请的方式来管理内存的分配,从而避免内存碎片化的问题.如果采用mallo和free来动态的申请和销毁内存,必然会产生大量的内存碎片. 基本知识 ...
- 十天学Linux内核之第三天---内存管理方式
原文:十天学Linux内核之第三天---内存管理方式 昨天分析的进程的代码让自己还在头昏目眩,脑子中这几天都是关于Linux内核的,对于自己出现的一些问题我会继续改正,希望和大家好好分享,共同进步.今 ...
- OC语言-05-OC语言-内存管理
一.引用计数器 1> 栈和堆 栈 ① 主要存储局部变量 ② 内存自动回收 堆 ① 主要存储需要动态分配内存的变量 ② 需要手动回收内存,是OC内存管理的对象 2> 简介 作用 ① 表示对象 ...
- OC基础15:内存管理和自动引用计数
"OC基础"这个分类的文章是我在自学Stephen G.Kochan的<Objective-C程序设计第6版>过程中的笔记. 1.什么是ARC? (1).ARC全名为A ...
- OC学习篇之---内存管理介绍和使用
在之前的一片文章我们说了OC中谓词操作:http://blog.csdn.net/jiangwei0910410003/article/details/41923507,从今天开始我们就来看一下OC中 ...
- OC第七节——内存管理
戏言: iOS开发已经到了一个ARC时代,一般不需要我们过多的去关注内存是怎么分配,怎么管理的.很长一段时间,我也不知道内存管理是什么鬼,但如果遇到这方面的问题,却找不到解决办法确实很头疼的.So,还 ...
- 三、内存管理单元---MMU
3.1 MMU介绍 3.1.1 MMU 特性 内存管理单元(Memory Management Unit)简称MMU,它负责虚拟地址到物理地址的映射,并提供硬件机制的内存访问权限检查.现在的多用户多进 ...
- oc 第五天(内存管理)
OC的重点: 内存管理 1 基本原理 OC的内存回收机制是和JAVA的自动回收机制是不同的,它有两种模式,或者准确的说是同 一种模式的两种不同体现,下面简单总结下. 1手动内存回收 ...
- 七.OC基础加强--1.内存管理 2.野指针,内存泄露 3.set方法的内存管理 4.@property参数 5.@class和循环retain的使用 6.NSString的内存管理
1,内存管理简单介绍 1,为什么要有内存管理? malloc selloc dealloc```需要回头复习 一般的内存 4s 是512m内存:6 是1024m内存: 当内存过大时,会耗尽内存.出现程 ...
- windows的三种内存管理方法
Windows的内存管理方法 windows提供了3种方法来进行内存管理: l 虚拟内存,最适合用来管理大型对象或者结构数组 l 内存映射文件,最适合用来管理大型数据流 ...
随机推荐
- DNS 隐蔽通道工具资料汇总
http://www.cnblogs.com/bonelee/p/7651746.html DNS隧道和工具 内含dns2tcp.iodine.dnscat2工具的简单使用说明 iodine工具的使用 ...
- 排序系列 之 冒泡排序及其改进算法 —— Java实现
冒泡排序算法 冒泡排序算法 改进一 冒泡排序算法 改进二 冒泡排序算法 改进三 冒泡排序算法 基本思想: 在要排序的一组数中,对当前还未排好序的范围内的全部数据,自上而下对相邻的两个数依次进行比较和调 ...
- npm run dev 出现警告
WARNING in ./node_modules/_webpack@3.10.0@webpack/buildin/global.js There are multiple modules with ...
- LeetCode Weekly Contest 25
1. 507. Perfect Number 显然小于2的都不满足(尤其是负数的情况),进一步,显然质数都不满足,所以小于4的数,直接return false. 然后依次暴力枚举判断到sqrt(n), ...
- 【media-queries】媒体查询,为了响应式设计而生
目录 简介 语法 常用尺寸 一 简介 针对现在纷杂的设备,css3中加入,可以查询你的浏览类型(screen彩色屏幕, print, all)和css属性判断. 最常用的就是查询屏幕大小,给予适合的展 ...
- Hadoop MapReduce编程 API入门系列之多个Job迭代式MapReduce运行(十二)
推荐 MapReduce分析明星微博数据 http://git.oschina.net/ljc520313/codeexample/tree/master/bigdata/hadoop/mapredu ...
- 图片文字滚动插件jQuery Scrollbox
图片文字滚动插件jQuery Scrollbox附件中提供了五种图片.文字滚动样式,只需调用jquery库和jQuery Scrollbox插件,然后再加一段简单的jquery代码即可使用,兼容性良好 ...
- datetime is null
本文转载自阿单<datetime is null> datetime 以'YYYY-MM-DD HH:MM:SS'格式检索和显示DATETIME值同时当datetime 为 null时 ...
- 移动端的0.5px
最近写移动端页面写的比较多,边边基本上都是用的1px,视觉上也确实有点小粗,这不闲下来啦,具体的研究了下0.5px是怎么实现的,切记,这个效果只有在手机上才能看到效果的 利用了css3的缩放效果 &l ...
- PhotoZoom Classic 7怎么样?对电脑和系统要求高不高?
PhotoZoom Classic 7怎么样?对电脑和系统要求高不高? 相较于更专业PhotoZoom Pro,标准版本的PhotoZoom Classic 7更适用于日常工作中的图片放大处理,例如在 ...