关于OC的内存管理-01
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相关推荐
- iOS - 内存管理 01
iOS - 内存管理 01 一.概述 内部管理简单来说就是计算机内部存储的管理,我们从冯·诺依曼结构说起,冯·诺依曼结构指出了计算机由运算器.控制器.存储器.输入和输出设备几大部件组成.拿 iPhon ...
- Objective-C基础笔记(3)OC的内存管理
Objective-C的内存基本管理 在OC中每一个变量都保存着引用计数器,当这个对象的引用计数器为0的时候该对象会被回收.当使用alloc.new或者copy创建一个对象的时候,对象的引用计数器被置 ...
- 十二:内存简单介绍和OC的内存管理
一.内存简单介绍 内存结构 1.运行时分配 (1)栈:用户存放程序临时创建的局部变量(先进后出). (2)堆:动态分配内存段. 2.编译器分配 (1)BSS段:存放未初始化的全局变量和静态变量. (2 ...
- Object-c学习之路二(oc内存管理黄金法则1)
今天看了看oc的内存管理,自己管理内存不能随便的release和retain 法则会出现野指针等错误.下面以人和读书的例子做练习. 1.主函数 // // main.m // MemoryManage ...
- OC内存管理常见面试题整理
1:简述OC中内存管理机制.与retain配对使用的方法是dealloc还是release,为什么?需要与alloc配对使用的方法是dealloc还是release,为什么?readwrite,rea ...
- iOS之深入解析内存管理的引用计数retainCount的底层原理
一.简介 ① 引用计数概念 OC 在创建对象时,不会直接返回该对象,而是返回一个指向对象的指针. OC 在内存管理上采用了引用计数,它是一个简单而有效管理对象生命周期的方式. 在对象内部保存一个用来表 ...
- Objective-C 内存管理机制
为什么要进行内存管理? 由于移动设备的内存极其有限,所以每个APP所占的内存也是有限制的,当app所占用的内存较多时,系统就会发出内存警告,这时需要回收一些不需要再继续使用的内存空间,比如回收一些不再 ...
- 内存管理2(主讲MRR)
内存管理2 我们讨论过properties 后,所有的内存管理系统都是通过控制所有对象的生命周期来减少内存的占用.iOS和OS X应用程序完成这些是通过对象拥有者来实现的,它保证了只要对象使用就会存在 ...
- OC-引用计数器,内存管理,野指针
总结 全局断点 →-->+-->Add Exception Breakpoint 开启僵尸监听 打开Edit scheme -->Diagnostics-->Enable Zo ...
最新文章
- 使用Vue的filters(本地)或filter(全局)过滤常用数据类型
- SMT32如何进入sleep模式
- 【小白学习tensorflow教程】一、tensorflow基本操作、快速构建线性回归和分类模型
- Android之Error: ‘L‘ is not a valid file-based resource name character解决办法
- C++学习——set与map
- php 获得焦点,jquery中blur()失去焦点与focus() 获取焦点事件
- python自动翻译视频字幕_利用 谷歌 python 快速翻译 英文字幕
- 安卓第十二天笔记-广播
- 基于fpga的方波发生器
- 国外电子与通信教材系列最新目录单
- 牛客 哔哩哔哩校招编程真题 给定一个整数数组,判断其中是否有3个数和为N 二分经典 三数之和
- DB DBMS SQL 分别是什么?
- C# openfiledialog文件单选和多选
- 传真服务器的常见问题处理
- Day 96/100 ‘X-Frame-Options‘ to ‘sameorigin‘后如何嵌入iframe
- 我看车展感(tu)想(cao)
- Sqlmap 渗透注入总是显示无法连接目标网络问题分析与解决
- 如何解决 coffee-script@1.12.7: CoffeeScript on NPM has moved to coffeescript (no hyphen)或者说不支持改系统
- 手把手教你怎么免费为微信公众号接入智能客服
- 山姆公司“会员制营销”和“EMAIL营销”培训方案