objective-c中的 内存管理(六)

Objective-C 【内存管理&手动内存管理 综述】 ——————————————————————————————————————————— 内存管理 (1)Objective-C的内存管理 栈区    存放局部变量(由于基本数据类型占用的存储空间是固定的,由系统去分配,我们不用去管,故栈区存放基本数据类型,) 堆区    存放程序运行过程中动态分配的内存空间(对象类型是程序运行过程中动态分配的,他们的大小不固定。比如说是 阅读详情

holydancer原创,如需转载,请在显要位置注明:

转自holydancer的优快云专栏,原文地址:http://blog.youkuaiyun.com/holydancer/article/details/7350318


objective c中的内存管理是很让人纠结的,如果程序从头到尾没有遇到内存泄漏或者别的内存问题倒也罢,如果一旦内存上出现了问题,那排起错来真是要人命啊,今天笔者大致介绍一下内存的实现原理,希望能在将来碰到内存问题时能够有些头绪。

我们都知道每个类在创造实例时都会在内存中给它划分一片区域用来存放信息,然后对象名作为指针指向该内存空间,如果这个对象不用了,那么这片内存区域就会被系统回收,抹掉内容或者覆盖上别的内容,objective c中没有java中那么强大的垃圾回收机制,网上有人称其为半自动模式,相当形象。那么我们通过什么来判断这个内存空间是否仍在使用呢,这里就需要引入一个概念:“引用计数(reference couting)”.当该对象创建时,该计数为1,说明有一个引用,如果不用时,就会减为0,这就表示不再使用了,那么就会销毁该空间。

引用计数会在使用new,alloc,copy创建对象时,会自动将引用计数设为1,可以通过retainCount来查看,如下:

#import <Foundation/Foundation.h>
@interface Man:NSObject
-(void)say;
@end
@implementation Man

-(void)say
{
    NSLog(@"man say");
}

@end
int main(int argc, const char * argv[])
{

    
        Man *man1=[Man new];
        NSLog(@"%lu",[man1 retainCount]);
        [man1 release];
   
    return 0;
}


2012-03-13 20:14:38.559 retain[2906:403] 1
当不再使用该对象时,要用release方法将该内存释放。

当不是用以上介绍的三种方法创建对象的话,我们不需要使用release方法手动释放,但是其计数仍为1,只是系统会自动释放。有的时候我们会长久使用一些对象,比如某些对象本身作为别的对象的参数之类又或者将其加入数组之类的,我们需要手动增加一个计数,retain一下,需要注意的是每retain一次,都要对应的有一个release,具体retain多少次,什么时候释放需要看代码环境,但是这个原则是肯定的,每retain一次,就要release释放一次。下面看一部分代码来理顺一下思路 :

#import <Foundation/Foundation.h>
@interface Man:NSObject
-(void)say;
@end
@implementation Man

-(void)say
{
    NSLog(@"man say");
}

@end
int main(int argc, const char * argv[])
{
    Man *man =[Man new];//生成一个新对象man,引用计数为1
    NSLog(@"%lu",[man retainCount]);//
    [man retain];//手动增加一个引用计数用以保留man对象,引用计数为2
    NSLog(@"%lu",[man retainCount]);
    [man release];//手动释放一个引用计数,现在count为1
    NSLog(@"%lu",[man retainCount]);
    [man release];//再释放一个,这时man对象的内存已经被抹掉了
    //[man say];如果这个方法不注释的话就会报错。
    NSLog(@"%lu",[man retainCount]);
    //这里之所以还为1,是因为这里是以man方法调用的,所以这里又生成了一个不知名的对象,但是这个对象中并没有
    //say方法了,但是因为这里重新用man引用了这片内存,所以计数仍为1.
    return 0;
    

}

2012-03-13 20:34:44.440 String[3870:403] 1
2012-03-13 20:34:44.443 String[3870:403] 2
2012-03-13 20:34:44.444 String[3870:403] 1
2012-03-13 20:34:44.445 String[3870:403] 1

 另外,objective c中引入了autorelease 和autorelease pool(自动释放对象池)的概念,可以自动释放对象。

Man *man =[[Man new] autorelease];这时就不用再释放。

自动释放池可以手动创建:

#import <Foundation/Foundation.h>
@interface Man:NSObject
-(void)say;
@end
@implementation Man

-(void)say
{
    NSLog(@"man say");
}

@end
int main(int argc, const char * argv[])
{
    NSAutoreleasePool *pool;
    pool =[[NSAutoreleasePool alloc] init];
    
    Man *man1;
    Man *man2;
    //可以将好好多对象放入一个自动释放池;
    [man1 autorelease];
    [man2 autorelease];
    //然后可以一下子释放池里所有的对象;
    [pool release];//相当于对池中每个对象执行了一次release;
    

}

一般情况下,只要在有new,alloc,copy出现后,记得要release,在手动retain后,记得也肯定会有release,并且retain和release是对应在一个对象身上,这样就不会出现问题。额,先这样吧,等什么时候有补充我再作更改,憋不住了,上厕所去。




关键字:objective-c ,objective c , oc ,内存管理,release, retain, copy ,alloc ,new

Objective-c与c++混编中的objc对象内存管理 Objective-c怪异的语法让很多其它平台转向iphone的开发者感到头疼不已,同时objective-c的类库虽然提供了像脚本一样容易使用的NSArray和NSDictionary容器,但是在一些对性能要求比较场合下这两个容器明显不给力,很多人选择objective-c++这种混编模式来开发,从而使用强大的C++ STL等类库。但是objc的对象内存管理相对而言比c++对象麻烦很多,比如将objc的对象直接保存在STL容器中时,默认的并不会对该对象进行任何管理,我们需要手动的retain和releas 阅读详情

相关推荐

理解 Objective-C 弱引用与内存管理

本文探讨了 Objective-C 中强引用循环的问题及解决方案。通过将某些引用声明为弱引用,我们可以防止强引用循环,从而正确管理内存。文章详细说明了弱引用的归零行为,并通过代码示例解释了如何使用弱引用。此外,文章还回顾了在自动引用计数(ARC)出现之前的手动引用计数时代,以及相关的内存管理规则和保留计数规则。

weixin_42593130的博客 1230

【Effective_Objective-C_5内存管理】

新年从iOS内存管理开始学习。OC是一门面向对象的语言,而面向对象语言里内存管理是一个重要的概念,想用一门语言写出内存使用效率高的代码就得掌握其中的细节,在OC引入ARC模式之后内存管理的事情几乎都是由编译器来决定的,这使我们学习内存管理变得简单许多内存管理虽然大部分内容讲的是关于MRC情况下的手动管理方法和原理,但其中不乏很多值得学习的思路,在MRC如何更好的管理内存,在ARC下什么该用什么不该用,都是值得学习的地方,内存管理很重要!

weixin_61639290的博客 1931

《深入浅出发Objective-C》 内存管理.pdf

Objective-C 内存管理 深入浅出发,熟悉内存管理。

Objective-C:内存管理

1 传统内存管理 Objective-C对象的生命周期可以分为:创建、存在、消亡。 1.1 引用计数 类似Java,Objective-C采用引用计算(reference counting)技术来管理对象的生命周期。每个对象都定义有一个整数(称引用计数器)与之相关联,该数用以表示当前有多少个指针指向该对象。 1.1.1 操作方法 当...

a567676的博客 275

PADS导出PCB正反面丝印为CAD文件的方法

本文介绍如何将PADS绘制的pcb格式的PCB文件顶底层丝印及板框导出为CAD的dxf文件格式,并且将底层丝印进行镜像为正常视角

luguodeyo的博客 3295

深入理解HanLP1.x,填平可能遇到的坑

提取指定数量的摘要。自定义词典为什么要单独领出来讲呢?因为在我们的业务开发中,可能分词的效果并不理想,需要定制自己的词库,索引更加常用。例如:小米su7特斯拉modelY比亚042025款6575767670908我们需要分出小米su72025款等词。我们分别看看用字典和不用字典的效果。

static_coder的博客 977

Objective-C中的内存管理机制详解

通过理解引用计数、自动释放池和ARC等原理,并遵循最佳实践来管理对象的生命周期,可以确保程序的稳定性和性能。本文将深入解析Objective-C中的内存管理机制,包括引用计数、自动释放池、ARC(Automatic Reference Counting,自动引用计数)以及常见的内存管理问题。当你将一个对象加入到自动释放池中时,该对象的引用计数会加1,但这个计数会在自动释放池被销毁时自动减1。为了避免这些问题,程序员应该仔细跟踪对象的生命周期,确保在不再需要对象时及时释放它们,并避免不必要的引用。

2401_84297769的博客 774

k8s RoCE 部署: k8s-rdma-shared-dev-plugin + macvlan cni

写给自己的入门篇 文章目录前言一、创建 k8s 集群二、启用 primary network三、启用 secondary networkk8s-rdma-shared-dev-pluginMultus CNISecondary CNIMulti-Network CRD四、启用 pod五、在 pod 中启动 RoCE 流量总结 前言 写给自己的扫盲篇。后续会在原理方面持续更新 一、创建 k8s 集群 k8s 集群的创建有多种方法,可以按照官方文档的说明来.

sunshuying1010的博客 9784

Objective-C内存管理

目录 文章目录目录1、引用计数1.1 优缺点1.2 alloc1.3 引用计数的流程2、MRC2.1 持有调用者自己的对象2.2 持有非调用者拥有的对象2.3 autorelease pool3、ARC3.1__strong修饰符3.2 _weak修饰符3.3 __unsafe_unretained3.4_ _autoreleasing4、@property关键字4.1 Atomicity(原子性)4.2 Access(存取特性)4.3 Storage(内存管理特性)(管理对象的生命周期的) 1、引用计数

nupt_zhai的博客 666

Python实战:用MNE-Python从脑电数据中提取P300成分(附完整代码)

本文提供了一份使用MNE-Python从脑电数据中提取P300成分的完整实战指南。通过详细的代码示例,系统讲解了从环境搭建、数据加载、预处理(滤波、分段、伪迹剔除)到P300波形提取、可视化与参数量化的全流程。重点介绍了如何利用零相位滤波和叠加平均技术,从EEG信号中精准分离出反映认知加工的P300事件相关电位,适用于脑机接口与认知神经科学研究。

weixin_29240343的博客 338

营销反作弊之 异常行为分析模型(一),附带python代码

通过对用户行为进行深入的分析,识别出与常规模式不符的异常行为,可以有效检测并阻止虚假广告点击、刷单、点击欺诈等欺诈行为。本文将详细探讨营销反欺诈中异常行为分析的方法,介绍如何通过数据采集、清洗、行为建模与异常检测,准确识别潜在的欺诈行为,并提供 Python 实现代码示例。**监督学习 (Supervised Learning):**在标注数据的帮助下,训练机器学习模型使其能预测未知数据的结果。营销反欺诈异常行为分析的整体流程涉及多个环节,确保通过对用户行为的深入分析,及时识别潜在的欺诈行为。

viviwiky的博客 1230

【Effective Objective-C】—— 内存管理

第29条:理解引用计数 OC使用引用计数来管理内存,也就是说,每个对象都有个可以递增或递减的计数器,如果某个对象引用他时就会给其引用计数加1,用完了之后,就递减其计数,直至为0,销毁这个对象。ARC实际上也是一种引用计数机制。 1.引用计数工作原理: 在引用计数架构下,对象有个计数器,用以表示当前有多少个事物想令此对象继续存活下去。NSObject协议声明了下面三个方法用于操作计数器: Retain 递增保留计数 release 递减保留计数 autorelease 待稍后清理“自动释放池”时,再递减

m0_55124878的博客 2421

强化学习(Q-learning、DQN) —— 理论、案例与交互式 GUI 实现

本文详细介绍了强化学习中基于值函数的 Q-learning 算法及深度强化学习的 DQN 方法,从基本理论、数学模型到算法流程均进行了全面阐述。通过迷宫导航、股票交易策略和机器人控制等典型案例,展示了强化学习在处理高维、非线性和时变问题中的强大适应性。为了帮助工程师和研究者更直观地理解强化学习的训练过程,本文还提供了一份基于 Python 与 PyQt6 实现的交互式 GUI 演示系统代码示例,用户可以在线调整参数,实时观察累计奖励和 Q 值的变化,从而更深入地理解算法收敛和策略演化的过程。

闲人编程的博客 1475

黑马程序员-iOS基础-Objective-C基础(六)内存管理

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------- 黑马程序员-iOS基础-Objective-C基础(六)内存管理 一、内存管理的必要性 移动设备内存空间极其有限 app占用内存较多时,系统会发出内存警告,必须回收一些不需要再使用的内存 二、内存管理的范围  任何继承了NSObject的对象  对其他基本数据类型、struct

deng0512的专栏 634

基于SVD矩阵分解的用户购物篮预测分析实战

基于SVD矩阵分解的用户购物篮预测分析实战

360

040、未来展望:MLIR与编译技术的演进方向

MLIR不是又一个编译框架,它更像是一套“元框架”——提供构建专用编译工具的能力。未来几年,我们会看到更多垂直领域(自动驾驶、射频信号处理、生物计算)出现基于MLIR的专用编译器,它们可能不会挂“MLIR”的名字,但内核都是这套可扩展的IR基础设施。不要等MLIR“成熟”再用,现在就该把它当成一把瑞士军刀,先挑刀口最锋利的那个功能(比如图优化、循环变换)用起来。编译技术的演进不再是学术界的独角戏,而是越来越贴近实际生产中的异构、动态、领域专用需求。

m0_50546716的博客 175

黑马程序员——Objective-C学习笔记(六):内存管理

——- android培训、IOS培训、期待与您交流! ———-

ff4415的专栏 535

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Objective-C学习之旅(六)----内存管理4----自动释放池

一、O-C当中的内存释放,并不是像java/.net那样有一个自动的释放池,开发人员不用去关心有关内存释放的问题,O-C里面的自动释放池比c语言的手动内存管理要好一些,但是相对于java/.net来说又弱一些,所以说O-C当中的释放属于半自动的释放池。 二、什么是自动释放池   1、Autorelease pool   自动释放池(Autorelease pool)是OC的一种内存...

weixin_30355437的博客 220

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Objective-C 内存管理

声明 欢迎转载,但是请尊重作者劳动成果,转载请保留此框内声明,谢谢。 文章出处:http://blog.youkuaiyun.com/iukey 大概是因为 Objective-C 是 C的超集,所以Objective-C 也使用alloc来申请内存,不同的是C调用free来直接释放内存,而Objective-C 不直接调用dealloc来释放内存。整个Objec

潇洒的程序员 9016

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Effective objective-c-- 内存管理

寒假比较忙没能能认真看,就拖到学校了来看了,进度落后很多了,只能尽量赶了;

m0_74217598的博客 4176

[精通Objective-C]内存管理

[精通Objective-C]内存管理参考书籍:《精通Objective-C》【美】 Keith Lee目录精通Objective-C内存管理 目录 程序的内存使用情况 手动管理 MRR内存管理基本原则 使用MRR 自动引用计数 ARC规则和约定 使用ARC 处理循环引用程序的内存使用情况Objective-C可执行程序是由(可执行)代码、初始化和未初始化的程序数据、链接信息、重定位信息、局部数据和

究极死胖兽的博客 5724

Objective-C 内存管理机制

一、Objective-C内存管理的对象。二、为什么要使用内存管理。三、Objective-C管理内存的方式。四、与内存有关的修饰符。五、MRC与ARC混编

lover0920的专栏 3292

objective-c 内存管理

免责申明(必读!):本博客提供的所有教程的翻译原稿均来自于互联网,仅供学习交流之用,切勿进行商业传播。同时,转载时不要移除本申明。如产生任何纠纷,均与本博客所有人、发表该翻译稿之人无任何关系。谢谢合作!   注:本教程由北方和我本人合作翻译。 教程截图:   当我检查其他开发人员的代码时,似乎最常见的错误总是围绕在以Object-C中的内存管理为中心。如果您使用的语言是java或C#,它

2039

Objective-C 内存管理基础

Objective-C 内存管理基础 https://www.jianshu.com/p/954bb5f73aa7 前言 之前的两篇拙文C语言-内存管理基础、C语言-内存管理深入 介绍了关于C语言在内存管理方面的相关知识。但是对于从事iOS开发的同胞们来说,显然Objective-C用的更多,所以笔者想用两篇文章尽量完整的介绍一下Objective-C的内存管理,本文为第一部分,将从类和对象、所有权策略及引用计数机制、内存管理原则、内存管理方式等几个方面展开。如果你能赏脸阅读此文,你会发现本文利.

kuangben2000的博客 205
上一篇: objective C中的@class, SEL , IMP等灵活机制(五)
下一篇: objective-c中的构造函数(对象初始化)(七)
holydancer
博客等级 码龄15年 474粉丝 59原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值