1.什么是内存管理?

大家都知道手机的内存是有限的,app应用的内存也应该是受限制的,随着app应用的使用会导致内存的占用率增大。当内存占用率达到一种程度时。系统会发出内存警告。这时我们须要把一些不用的对象和变量所占用的内存释放掉,也就是说我们须要手动对内存进行管理。

而我们管理的范围:不论什么继承了NSObject 的对象,对于基本数据类型(比方float、int 、char、struct、enum等)则是无效的。

2.怎样进行内存管理

1)每一个OC对象本身就有一个占用4个字节内存的计数器,它存储的是一个整数。表示“当前对象被引用的次数”。当对象一被建立的时候(比如alloc、new、copy)就默觉得1。而计数器的作用就是,当对象的计数器为0时,当前对象就会被系统回收,假设计数器不为0,程序的整个运行过程中,当前对象的内存就一直不回被回收

2)引用计数器的三种操作

(1)retain(给对象发送消息一条retain消息)   计数器+1,有返回值,返回的是对象本身

(2)release (给对象发送消息一条release消息)计数器-1。无返回值。

(3)retainCount (给对象发送消息一条retainCount消息)获取当前对象的引用计数器值

3.当对象销毁时系统会自己主动调用dealloc方法,dealloc方法就像临终遗言一样,所以我们一般重写dealloc方法

而且此方法中,一定要有[super dealloc] ,且一定放在最后面。

3.如果我们有一个Person 类

#import <Foundation/Foundation.h >

@interface Person : NSObject

{

{

int _age ;

}

-(void)setAge:(int)age;

-(int)age;

}

#import"Person.h"

@implementation Person

{

-(void)setAge:(int)age{

_age = age ;

}

-(int)age{

return _age;

}

-(void)dealloc{

NSLog(@"Person 对象被回收");

[super dealloc]。

}

(1)第一种情况

int main(){

//当我们一调用alloc时,对象计数器就默觉得1。所以一有alloc ,我们须在后面加上[对象名 release]

//p-1(当前计数器为1)

Person *p =[[Person alloc] init];

//p-2(当前计数器为2)

[p retain];

//release表示计数器减1,此时p-1

[p  release];

//p-0,这时系统会回收对象p ,运行对象p的dealloc方法

[p  release];

return 0;

}

(2)另外一种情况

int main(){

//当我们一调用alloc时,对象计数器就默觉得1。

所以一有alloc ,我们须在后面加上[对象名 release]

//p-1(当前计数器为1)

Person *p =[[Person alloc] init];

//p-2(当前计数器为2)

[p retain];

//release表示计数器减1,此时p-1

[p  release];

//p-0,这时系统会回收对象p 。运行对象p的dealloc方法

[p  release]。

//特别。此时系统已把对象p回收,假设我们在这里再多次运行[p release]的话

//会訪问僵尸对象(已被系统回收的对象,一块不可用的内存)

//而p这时则叫野指针(指向僵尸对象的指针),会造成坏的訪问即EXC_BAD_ACCESS

return 0;

}

如图:

(3)第三种情况

int main(){

//当我们一调用alloc时,对象计数器就默觉得1。所以一有alloc ,我们须在后面加上[对象名 release]

//p-1(当前计数器为1)

Person *p =[[Person alloc] init];

//p-2(当前计数器为2)

[p retain];

//release表示计数器减1,此时p-1

[p  release];

//p-0。这时系统会回收对象p ,运行对象p的dealloc方法

//运行此句的话。假设不打开Enable Zoombie Object 则不会报错

//假设打开的话。则会出现这种提示错误

//message send to deallocated instance

//意思是给已经回收的实例发送消息

p.age = 10;

return 0;

}

如图:

(4)第四种情况;

int main(){

//当我们一调用alloc时,对象计数器就默觉得1。所以一有alloc ,我们须在后面加上[对象名 release]

//p-1(当前计数器为1)

Person *p =[[Person alloc] init];

//p-2(当前计数器为2)

[p retain];

//release表示计数器减1,此时p-1

[p  release];

[p  release];

//结合第三种情况。我们就会这样想,这时计数器本来是0,我们能够运行retain。计数器+1

//我们不就能够成功运行p.age = 10;了吗 其实,回收的对象是不可能死而复生的。

//运行的结果如上图。

//message send to deallocated instance

//意思是给已经回收的实例发送消息

p.age = 10;

return 0;

}

关于OC的内存管理-01相关推荐

  1. iOS - 内存管理 01

    iOS - 内存管理 01 一.概述 内部管理简单来说就是计算机内部存储的管理,我们从冯·诺依曼结构说起,冯·诺依曼结构指出了计算机由运算器.控制器.存储器.输入和输出设备几大部件组成.拿 iPhon ...

  2. Objective-C基础笔记(3)OC的内存管理

    Objective-C的内存基本管理 在OC中每一个变量都保存着引用计数器,当这个对象的引用计数器为0的时候该对象会被回收.当使用alloc.new或者copy创建一个对象的时候,对象的引用计数器被置 ...

  3. 十二:内存简单介绍和OC的内存管理

    一.内存简单介绍 内存结构 1.运行时分配 (1)栈:用户存放程序临时创建的局部变量(先进后出). (2)堆:动态分配内存段. 2.编译器分配 (1)BSS段:存放未初始化的全局变量和静态变量. (2 ...

  4. Object-c学习之路二(oc内存管理黄金法则1)

    今天看了看oc的内存管理,自己管理内存不能随便的release和retain 法则会出现野指针等错误.下面以人和读书的例子做练习. 1.主函数 // // main.m // MemoryManage ...

  5. OC内存管理常见面试题整理

    1:简述OC中内存管理机制.与retain配对使用的方法是dealloc还是release,为什么?需要与alloc配对使用的方法是dealloc还是release,为什么?readwrite,rea ...

  6. iOS之深入解析内存管理的引用计数retainCount的底层原理

    一.简介 ① 引用计数概念 OC 在创建对象时,不会直接返回该对象,而是返回一个指向对象的指针. OC 在内存管理上采用了引用计数,它是一个简单而有效管理对象生命周期的方式. 在对象内部保存一个用来表 ...

  7. Objective-C 内存管理机制

    为什么要进行内存管理? 由于移动设备的内存极其有限,所以每个APP所占的内存也是有限制的,当app所占用的内存较多时,系统就会发出内存警告,这时需要回收一些不需要再继续使用的内存空间,比如回收一些不再 ...

  8. 内存管理2(主讲MRR)

    内存管理2 我们讨论过properties 后,所有的内存管理系统都是通过控制所有对象的生命周期来减少内存的占用.iOS和OS X应用程序完成这些是通过对象拥有者来实现的,它保证了只要对象使用就会存在 ...

  9. OC-引用计数器,内存管理,野指针

    总结 全局断点 →-->+-->Add Exception Breakpoint 开启僵尸监听 打开Edit scheme -->Diagnostics-->Enable Zo ...

最新文章

  1. C#当中的BeginInvoke和EndInvoke
  2. 实例说明代码段(.text)、数据段(.data)、bss段、只读数据段(.rodata)、堆栈的划分依据
  3. python四则运算器tkinter_Python基于Tkinter的二输入规则器(乞丐版)
  4. Blazor确认复选框组件
  5. 使用C#将DataTable导出到文件
  6. ashx获取input file 文件_前端战五渣学前端——FileReader预览本地文件
  7. html 标签 anki,为什么不建议使用Anki模板里的标签?
  8. Nginx学习总结(1)——Nginx入门简介
  9. 借助共享缓存redis实现分布式锁
  10. VMware 12 许可密钥
  11. Tomcat8安装配置
  12. Web应用程序开发方法研究
  13. 制药工程专业计算机考试考哪样,制药工程考研可以考什么专业
  14. 关于使用win10易升,升级后电脑变卡解决方法
  15. 分享一款国产并口PSRAM存储芯片EMI164NA16LM
  16. python的scipy层次聚类参数详解
  17. 取原始数组中的指定数据push新数组
  18. 北漂7年,我最终还是回了老家。。。
  19. 学友新碟lt;lt;private corner迷你音乐会gt;gt;CD/DVD超赞呀
  20. 工业路由器下水/电/煤自助缴费终端机联网远程监测

热门文章

  1. 如何在aspx.cs 里面获取html 控件值
  2. 遇到问题描述:Android Please ensure that adb is correctly located at问题解决
  3. MYSQL 取随机记录的方法
  4. markdown常用操作(特殊字符显示、换行、字体颜色和大小、图片位置和大小)
  5. Linux中使用ps、awk、sh一起批量杀死所有的dotnet进程。
  6. Linux安装及服务控制
  7. hybird 跨平台移动app开发
  8. Android WebView 与 JS 交互
  9. Cocos2d-x使用iOS游戏内付费IAP(C++篇)
  10. 使用微软WPF技术开发产品优势究竟在那里