OC_浅谈Object-C的内存管理机制

Cadence Virtuoso VIVA波形分析:从背景色修改到线宽调整的完整指南 本文详细介绍了Cadence Virtuoso VIVA波形分析工具的核心使用技巧,包括背景色修改、线宽调整等高级功能。通过具体操作步骤和配置方法,帮助工程师优化波形显示效果,提升工作效率。特别强调了与Calculator组件的配合使用,以及专业波形图的输出技巧。 阅读详情

和C++一样通过内存操作获得的空间在使用完毕后需要释放内存否则就会造成内存泄露,接下来就让我们一起看看OC的内存管理机制;
首先我们知道oc的内存管理分为两部分:1、自动内存管理。2、手动内存管理。好,接下来我们就分别从这两个方面来探讨oc的内
存管理机制
在介绍具体具体的管理方法前,我先讨论一些概念性的问题:
1、对象:什么是对象?
标准定义:对象就是客观世界存在的人、事、物体等实体在计算机逻辑中的映射。说实话看完这句话,我想大多数读者应该和我一样
一头雾水,似懂非懂。依照我的理解(不谈客观世界,只在计算机逻辑内理解),我觉得对象其实就是一段内存里的保存的一些数据
组成的一个程序运行单位,而这段内存里的数据是根据事先定义好的类来创建的,里面包含有成员变量,还包含有成员函数(不包含
静态函数)。
2、引用:什么是引用?
对于每一个对象,我们已经知道他就是一段内存数据。那我们应该如何使用这段内存呢?(例如,现在你的盆友站在一旁,你盆友这
人的实体已经存在,可是你如何与他让他过来,帮你的忙呢?这时候可能会有读者会说:把他叫过来不就好了吗?很对,你要叫他就
必须有一个称谓.....)其实每一个对象都有“称谓”,有时不止一个。而这个“称谓”就是对象的引用。
3、引用计数器:什么是引用计数器?
既然每个对象都有引用,这时候就需要对象内部包含另外一个对象,而这个对象就是记录了他所在的这个对象现在又几个引用。
4、--------------------
好了,既然我们已经了解了一些基本概念,那么就让我们回过头来再讨论内存的管理。系统会在什么时候来回收内存呢?学过Java的
读者知道Java是自动内存管理的,一旦没有引用指向一个对象,就说明次对象已经丢失再也找不回来了,这个时候就会自动释放这个
对象所在的内存。而学过C++的读者知道,一个C++对象必须手动的释放内存,才可以,否者即使对象已经丢失无法找回,内存也不会
释放,进而造成内存泄露。OC是如何管理内存的呢?其实OC是根据引用计数器来管理内存的,只有当引用计数器为0时,内存才会释放
,其他情况内存都不会释放(引用计数器为0时,就算还有引用指向对象,内存也会释放。同样的,如果引用计数器不为0,就算已经
没有引用指向对象,内存也不会释放--->内存泄露)。
一、自动内存管理
autorelease:
在创建对象时,在外层声明autorelease,此时此对象就会变成自动释放的对象。但是我们必须说明,使用autorelease虽然是自动释放
但并不是立即释放,而是延迟释放。那么既然是延迟释放,那究竟是在什么时候释放的呢?说这个问题之间我们必须首先探讨一个问题:
autorelease到底对创建的对象做了什么?其实我们在对新建的对象进行autorelease操作时,就是将新建对象加入到了autoreleasepool
栈。那么感慨是的问题就明白了,每当一个autoreleasepool执行完毕时,加入到autoreleasepool中的对象都会被释放掉
二。手动内存管理
其实手动内存管理就是对两个函数的使用release和retain。
我们知道当使用alloc进行对象创建时,会把对象的引用计数器置为1,其实还有一个函数可以使对现代引用计数器加一,那就是retain,
每当我们调用retain函数时,对象的引用计数器就会加一。
我们每当将对象释放时都会调用release函数,那么调用了release函数后对象就一定会被释放吗?答案显然是否定的。其实,我们每次
调用release时都是让对象的引用计数器减一,当我们调用了release后,对象计数器肯定也减一,但是如果计数器的值在减一后还是
大于0那么对象就不会被释放。所以,引用是否会被释放,不在于是否调用了release函数,而是引用计数器是否为0.再提醒一点,如果
内存已经释放,再调用release的话就会报异常。
三、dealloc方法
dealloc方法是一个由编译器调用的方法,程序员不能再外部或内部调用。
每当一个对象被释放时,这个函数都会被自动调用,也就是说,这个函数一定会被调用,而且一定是此对象最后调用的一个函数。
因此如果你有神马操作想在对象释放前操作,就写在这个函数里吧
四、应用实例
假如说我们声明了以下类:

@interface Student : NSObject                    //设计一个学生类
Teacher *tec;                                    //有一个老师类型的成员变量
.......
.......
-(void)setTeacher:(Teacher*) newTec;  //老师成员变量的set方法
.......
@end

@implementation

-(void)setTeacher:(Teacher*) newTec{
    tec = newTec;
    [tec retain];
}

.......
.......
-(void)dealloc(){
    [tec release];
    [super dealloc];
}

@end

总之,内存管理一条原则:谁创建,谁释放;谁污染,谁治理;

基于Pycatia的智能孔特征识别技术:无参模型圆心自动化提取方案 阅读详情

相关推荐

【Qt】使用QMediaPlayer播放视频

window平台可以安装K-Lite,linux平台一般各发行版都会默认安装GSteam。播放RTSP视频时,可以使用VLC播放器搭建一个视频推流服务器,用于拉流的客户端的调试。3、如果没有添加Qt环境变量,请把关联的Qt5MultimediaWidgets.dll和Qt5Multimedia.dll放到进程路径下否则也会报ServiceMissingError错误。2、需要安装解码器,否则报 ServiceMissingError 无法找到服务的错误。1、需要在.pro工程文件中引用对应模块。

奔涌的后浪的专栏 2218

OC-内存管理-常见错误

学习了OC中的内存管理,记录一下内存管理中常见的三个问题:野指针,内存泄露,内存过度释放。 首先,创建一个Person 类,完成属性设置,name ,sex,age   再设置一个便利构造器类方法,来设置属性值 前提介绍完了,下面看一下常见错误代码: 第一个要介绍的是野指针错误,即指向一个你没有所有权的内存空间,并且该内容空间已经被释放 @autoreleas

Net_Joe的专栏 594

语言随机效应模型_线性混合效应模型 VS 方差分析

线性混合效应模型相比方差分析具有很多优点。为了让大家更直观的了解,我们来做一下两者的对比。基于模拟的方法,生成了以下数据dat_sim:这种数据格式是长格式,也就是从实验软件导出来的那种数据格式。这种数据格式可以直接使用线性混合效应模型进行分析。该实验设计是被试内项目间的单因素两水平设计。category是自变量,两个水平分别是outgroup和ingroup,outgroup比ingr...

weixin_31960565的博客 2688

OC-自动释放池、多态、协议

OC的自动释放池和多态以及协议等的使用说明

shuan9999的博客 722

简单的图书管理系统---SpringBoot+mysql通过前后端分离实现增删查改

SpringBoot+mysql通过前后端分离实现增删查改 上篇文章介绍了如何写后端接口 SpringBoot连接MySQL获取数据写后端接口 这篇文章,我们就介绍一下怎么写前端 点击修改跳出修改界面,点击添加书籍跳出添加书籍界面 点击删除,直接删除一行数据 其他的也没什么解释了,直接上代码(看不懂的可以私聊我哟) <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>

爱笑的博客 2014

使用MID360在室内快速定位

在预构建的点云地图中实现实时3D全球定位。通过融合FAST-LIO的低频全局定位(约0.5~0.2Hz)和高频里程计,整个系统的计算效率很高。消除里程计的累计误差初始定位可以通过RVIZ的粗略手动估计或来自另一个传感器/算法的姿势来提供。

CTwinkle的博客 1161

OC内存管理release、autorelease和set方法内存管理

内存管理:   对象保存在堆中,并且不会自己消除,需要我们手动管理   变量保存在栈中,自己会消失 1.对象的基本结构    每个OC对象都有自己的引用计数器,是一个整数,表示对象被引用的次数,即有多少人正在使用这个 OC对象。    每个OC对象内部专

why_not_的专栏 1316

命名管道和匿名管道

我们知道进程间是可以通信的。可以达到数据传输、资源共享、事件通知、进程控制等目的。进程间通信主要包括管道、系统IPC,套接字等。 管道分为三种: 普通管道:一是单工,只能单向传输 ,二是仅能在父子进程或者兄弟进程中使用。 流管道:去除了第一种限制,为半双工,可以双向传递, 命名管道:去除了第二种限制 ,可以在很多并不相关的进程 中进行通信。 1、普通管道 int pipe(int f...

ffsiwei的博客 1万+

【Effective Objective-C】内存管理

文章目录前言理解引用计数引用计数工作原理属性存取方法中的内存管理自动释放池保留环要点以ARC简化引用计数 前言 在OC这种面相对象的语言里,内存管理是个重要概念。要想用一门语言写出内存使用效率高而且又没有bug代码,就得掌握其内存管理模型的种种细节。 一旦理解了这些规则,你就会发现,其实OC的内存管理没那么复杂,而且有了“自动引用计数”(Automatic Reference Counting,ARC)之后,就变得更为简单了。ARC几乎把所有内存管理事宜都交由编译器来决定,开发者只需专注于业务逻辑。 理

kochunk1t的博客 1900

ARM CMSIS DAP源码分析(二)

今天分析的是RDDI_DAP_GetARMRegs(DWORD *regs, DWORD *rfpu, ULONG64 mask)和RDDI_DAP_SetARMRegs(DWORD *regs, DWORD *rfpu, ULONG64 mask)这两个函数。 以RDDI_DAP_GetARMRegs(DWORD *regs, DWORD *rfpu, ULONG64 mask)为例,代码如下:

pengxiao618的专栏 7976

NXOpenC#-通用NX对象操作Tag,Handle,TaggedObject介绍

NXOpenC#-通用NX对象操作Tag,Handle,TaggedObject介绍

阿飞2018 1183

IOS第四节:OC中的内存管理机制

自动释放pool [autorelease方法和自动释放池] 每一个对象都有一个autorelease方法,调用autorelease方法之后不会像调用release方法一样马上释放对象, 当一个对象调用一个autorelease的时候,这个对象就会被放倒main函数开始时设置的自动释放池里 当整个函数执行完毕之后,autoreleasepool才会销毁,销毁时把自己内部所有的对象

u013370834的博客 442

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

iOS —— 简述OC 的内存管理机制

关于OC 的内存管理有很多模糊的地方,下面我们一一说起 首先概念性问题 概念 为什么进行内存管理 由于移动设备的内存极其有限,所以每个APP所占的内存也是有限制的,当app所占用的内存较多时,系统就会发出内存警告,这时需要回收一些不需要再继续使用的内存空间,比如回收一些不再使用的对象和变量等。 内存管理类型: OC 类型 基本类型和C语言的类型:如: int,short

ci915194561的专栏 3736

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

object-c(oc)内存管理机制详解

.内存的创建和释放    让我们以Object-c世界中最最简单的申请内存方式展开,谈谈关于一个对象的生命周期。首先创建一个对象: 1 2 3 //“ClassName”是任何你想写的类名,比如NSString  NSArray等一切随意 id testObject = [[ClassName alloc] init]; 注: alloc

lzylzy1991的专栏 443

JAVA、OC的内存管理机制的本质

首先介绍一下内存管理的五个存储区 1.堆 ----这里是由程序员控制的分配和回收的,当程序员忘记回收时,程序结束时系统会自动进行回收。 2.栈 ----这里的内存空间是由编译器分配的,里面的变量通常是局部变量,函数参数,指针等。 3.自由存储区----是那些由malloc等分配的内存块,和堆相似,不过它是由 free 来结束自己的生命。 4.全局/静态存储区----用来存储全局变量和静态变

GZF的博客 1020

OC浅谈内存管理

OC浅谈内存管理 为什么要进行内存管理 由于移动设备的内存是及其有限的,所以每个APP所占的内存也是有限制的,当APP所占用的内存较多时,系统就会发出内存警告,此时需要回收一些不再需要使用的内存空间,比如回收一些不再使用的对象和变量等。 内存的管理范围:任何继承NSObject的对象,对其他的基本数据类型无效。 内存的本质原因:因为对象和其他数据类型在系统中的存储空间不一样。其他局部变量...

same_life的博客 497

iOS---Object-C之内存管理机制

概述在程序运行过程中需要创建大量的对象,Object-C中对象是存储在堆中的,系统不会自动释放堆中的内存(基本类型数据是由系统自己管理的,放在栈上)。如果一个对象创建后并没有得到及时的释放则就会占用大量的内存。其他高级语言入C#、Java等都是通过垃圾回收(GC)来解决的,但是在OC中并没有类似的垃圾回收机制,因此OC的内存管理需要由开发人员手动处理。1.引用计数器 2.属性参数 3.自动释放池

C_Lluckying的博客 991

【OC基础】03-OC内存管理

【OC基础】03-OC内存管理 概述 跟Java和C#类似,OC创建的对象在堆上。与Java和C#不同的是Java和C#有垃圾回收机制,所以不需要程序员手动释放堆上的内存。而OC没有垃圾回收机制,必须手动管理内存的创建和释放。下面介绍一下OC内存管理内存管理的方式...

baju4101的博客 250

OC的内存管理引用计数机制

我们知道,程序在堆区的内存管理需要程序员手动来分配及回收,什么时候分配,什么时候回收,这就是内存管理了。 苹果的OC语言,对于内存管理是用一种叫做引用技术机制的管理方式,说简单点就是给这块内存空间挂一个写着整数的牌子,当牌子上的数字不为0时,这块内存地址就不回收,程序员可以用alloc,retain,release,autorelease,对这个牌子上的数字进行增减。在IOS5之前,这件事都是由

laomaoshiba的专栏 1238

OC内存管理机制学习笔记

一、OC内存管理机制有三种 1、引用计数 2、ARC 3、垃圾回收(仅在mac 台式机 中 在iPhone iPai 中没有) 二、原理分析 1、程序崩溃情况: (1)多次释放 使得程序崩溃 Student * zhang = [[Student alloc] init]; [zhang release]; [zhang release]; (2)多个对象没有释放,占用太多内存使得程序给OS杀死 Student * zhang = [[Student alloc] init].

qq_41855962的博客 552

Object-C 内存管理

  原文学习记录来自:文顶顶博客园   一、内存管理基本原理 1、管理范围:        任何继承NSObject的对象 (对其他的基本数据类型无效)       本质原因:     对象和其他数据类型在系统中的存储空间不一样(其他局部变量主要存储于栈中,而对象存储于堆中)     当代码块结束时这个代码块中涉及的所有局部变量会被回收,指向对象的指针也被回收,此时对象已经没有指针...

qq_28596071的博客 822

OC - 浅谈内存管理

今天看到一篇不错的文章关于OC内存管理的,转载一下与你共享 概述我们知道在程序运行过程中要创建大量的对象,和其他高级语言类似,在ObjC中对象时存储在堆中的,系统并不会自动释放堆中的内存(注意基本类型是由系统自己管理的,放在栈上)。如果一个对象创建并使用后没有得到及时释放那么就会占用大量内存。其他高级语言如C#、Java都是通过垃圾回收来(GC)解决这个问题的,但在OjbC中并没有类似...

145

OC内存管理重点

1.OC内存管理中@class用法 (1)@property (nonatomic,retain) 类名 *对象名 如果两个类A,B相互引用,在头文件中用@class关键字来声明类A和B 如果在A类实现文件.m中要包含B类的头文件.h,需要#import “B.h” 如果A类要引用B类,在A类的头文件中不能#import “B.h”(原因是这样会导入B类的所有源文件

shenjian870723的博客 504

OC的内存管理

1.oc的内存管理对C语言的基本类型无效 The basic rule to apply is everything that increases the reference counter with alloc, [mutable]copy[withZone:] or retain is in charge of the corresponding [auto]release.

Sun 316

Object C 内存管理

1.内存管理         ·内存管理是关于如何管理对象生命周期的编程原则 ·OC的内存管理只针对于对象,基本数据类型不需要管理内存 ·当以一个对象没有再被使用时,应该从内存中释放掉 ·所以的对象都有一个计数器,叫做引用计数(retainCount),表示该对象当前被多少“人”在使用。 ·当引用计数为0时,系统会销毁该对象 2.对象的基本结构    

Focus Now 1072

Objective-C 内存管理

Objective-C 内存管理 Objective-C 内存管理 堆(heap)和栈(stack) 引用计数 MRC 与 ARC 管理对象 (ARC) CF 对象和 OC 对象的内存管理权转换 NSAutoreleasePool ARC 下的 autoreleasepool MRC 下的 autoreleasepool MRC(Mannul Reference Countin...

Jerry’s Blog 449

C与OC的区别和联系

C语言的特点: 1)C语言是结构化语言,层次清晰,调试和维护比较容易 2)表现能力和处理能力比较强,可直接访问内存的物理地址 3)c语言实现对硬件的编辑,c语言课用语系统软件的开发,也可用语应用软件的开发,是集高级语言和低级语言的功能一体。 4)C语言效率高,可移植性强。 C++语言特点: 1、在C语言的基础上进行扩充和完善,使C++兼容了C语言的面向过程特点,又成为了一种面向

SHZnt的博客 1543
上一篇: OC_关于Object-C类的创建以及应用
下一篇: OC_关于property、synthesize的使用
Core__Java
博客等级 码龄14年 12粉丝 18原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值