内存管理:

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方法。说明你又声明那块内存是属于你的,这时候就会发生野指针
错误。

注意:当一个对象retain0的时候。这时候你就不能再调用他的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第三天(内存管理)的更多相关文章

  1. memcache(三)内存管理

    memcached(三)内存管理 memcached使用预申请的方式来管理内存的分配,从而避免内存碎片化的问题.如果采用mallo和free来动态的申请和销毁内存,必然会产生大量的内存碎片. 基本知识 ...

  2. 十天学Linux内核之第三天---内存管理方式

    原文:十天学Linux内核之第三天---内存管理方式 昨天分析的进程的代码让自己还在头昏目眩,脑子中这几天都是关于Linux内核的,对于自己出现的一些问题我会继续改正,希望和大家好好分享,共同进步.今 ...

  3. OC语言-05-OC语言-内存管理

    一.引用计数器 1> 栈和堆 栈 ① 主要存储局部变量 ② 内存自动回收 堆 ① 主要存储需要动态分配内存的变量 ② 需要手动回收内存,是OC内存管理的对象 2> 简介 作用 ① 表示对象 ...

  4. OC基础15:内存管理和自动引用计数

    "OC基础"这个分类的文章是我在自学Stephen G.Kochan的<Objective-C程序设计第6版>过程中的笔记. 1.什么是ARC? (1).ARC全名为A ...

  5. OC学习篇之---内存管理介绍和使用

    在之前的一片文章我们说了OC中谓词操作:http://blog.csdn.net/jiangwei0910410003/article/details/41923507,从今天开始我们就来看一下OC中 ...

  6. OC第七节——内存管理

    戏言: iOS开发已经到了一个ARC时代,一般不需要我们过多的去关注内存是怎么分配,怎么管理的.很长一段时间,我也不知道内存管理是什么鬼,但如果遇到这方面的问题,却找不到解决办法确实很头疼的.So,还 ...

  7. 三、内存管理单元---MMU

    3.1 MMU介绍 3.1.1 MMU 特性 内存管理单元(Memory Management Unit)简称MMU,它负责虚拟地址到物理地址的映射,并提供硬件机制的内存访问权限检查.现在的多用户多进 ...

  8. oc 第五天(内存管理)

    OC的重点: 内存管理 1 基本原理     OC的内存回收机制是和JAVA的自动回收机制是不同的,它有两种模式,或者准确的说是同 一种模式的两种不同体现,下面简单总结下. 1手动内存回收       ...

  9. 七.OC基础加强--1.内存管理 2.野指针,内存泄露 3.set方法的内存管理 4.@property参数 5.@class和循环retain的使用 6.NSString的内存管理

    1,内存管理简单介绍 1,为什么要有内存管理? malloc selloc dealloc```需要回头复习 一般的内存 4s 是512m内存:6 是1024m内存: 当内存过大时,会耗尽内存.出现程 ...

  10. windows的三种内存管理方法

    Windows的内存管理方法 windows提供了3种方法来进行内存管理: l         虚拟内存,最适合用来管理大型对象或者结构数组 l         内存映射文件,最适合用来管理大型数据流 ...

随机推荐

  1. AVL树、splay树(伸展树)和红黑树比较

    AVL树.splay树(伸展树)和红黑树比较 一.AVL树: 优点:查找.插入和删除,最坏复杂度均为O(logN).实现操作简单 如过是随机插入或者删除,其理论上可以得到O(logN)的复杂度,但是实 ...

  2. [HTML] 微信开发之移动手机WEB页面(HTML5)Javascript实现一键拨号及短信发送功能

    在做一个微信的微网站中的一个便民服务电话功能的应用,用到移动web页面中列出的电话号码,点击需要实现调用通讯录,网页一键拨号的拨打电话功能. 如果需要在移动浏览器中实现拨打电话,发送email,美国服 ...

  3. Redis位图法记录在线用户的状态

    Redis位图法记录在线用户的状态 位图 Redis官方文档对于位图的介绍如下: 位图不是一个真实的数据类型,而是定义在字符串类型上的面向位的操作的集合.由于字符串类型是二进制安全的二进制大对象,并且 ...

  4. 【优化算法】遗传算法GA求解混合流水车间调度问题(附C++代码)

    00 前言 各位读者大家好,好久没有介绍算法的推文了,感觉愧对了读者们热爱学习的心灵.于是,今天我们带来了一个神奇的优化算法--遗传算法! 它的优点包括但不限于: 遗传算法对所求解的优化问题没有太多的 ...

  5. Dapper中数据表的字段(列)与实体属性不一致时,如何手动配置它们之间的映射?

    NET[C#]Dapper中数据表的字段(列)与实体属性不一致时,如何手动配置它们之间的映射? 问题描述 比如有如下的数据表结构:Person: person_id int first_name va ...

  6. ubuntu16.04 下载 fabric

    1 Fabric源码下载 我们可以使用Git命令下载源码,也可以使用go get命令,偷懒一点,我们直接用go get命令获取最新的Fabric源码: go get github.com/hyperl ...

  7. [翻译]内存一致性模型 --- memory consistency model

    I will just give the analogy with which I understand memory consistency models (or memory models, fo ...

  8. 设计模式(C++实现)--一句话总结

    原文链接:http://blog.csdn.net/LCL_data/article/details/12117349 按照目的来分,设计模式可以分为创建型模式.结构型模式和行为型模式. 按照目的来分 ...

  9. 数据库_数据分片与mycat服务

    1.数据分片; 2.部署mycat服务;3.基于mycat服务创建新库新表. 一,数据分片 1.数据分片,也叫分库分表,即将存放在一台数据库服务器中的数据,按照特定方式进行拆分,分散存放到其它多台服务 ...

  10. python编写简单的html登陆页面(4)

    python编写简单的html登陆页面(4)   1  在python编写简单的html登陆页面(2)的基础上在延伸一下: 可以将动态态分配数据,建立表格,存放学生信息 2 实现的效果如下: 3  动 ...