Iphone开发(6) 如何保证不出现内存泄露

iOS内存泄漏问题 作为一名iOS开发攻城狮,在苹果没有出ARC(自动内存管理机制)时,我们几乎有一半的开发时间都耗费在怎么管理内存上.后来苹果很人性的出了ARC,虽然在很大程度上,帮助我们开发者节省了精力和时间.但是我们在开发过程中,由于种种原因,还是会出现内存泄露的问题. 内存泄露是一个很严重的问题.下面就简单介绍下怎么使用Xcode7自带的Instruments中的Leaks检测我们的程序有没有内存泄露和 阅读详情

Objective-C已经有了垃圾回收机制,但是我们最关心的iso不支持垃圾回收,所以,让我们冷静一下,抛开垃圾回收,自己来管理内存吧。


对象所有权:当一个对象的属性是另外一个对象的时候,换言之,对象A中,有一个属性是对象B,那么,对象A对于对象B,就有对象所有权。那么,在对象A释放的时候,我们必须确保对象B的引用计数减少1(这里不一定是释放对象B,因为对象B还可能在其他地方被引用)。


        一个非常常见的例子就是set方法,把一个对象设置为另外一个对象的属性。在这里,我们必须确保引用计数不混乱,一个良好的实现如下:

//这里还没有解决Car释放的时候,Engine跟着释放
-(void) setEngine:(Engine *) newEngine
{
    [newEngine retain];//增加newEngine的引用计数,标示着Car对newEngine的对象所有权
    [engine release];//释放旧的engine
    engine = newEngine;//引用新的newEngine
}


自动释放池:一个容器,可以装载对象,当池销毁的时候,同时给每一个对象发送release消息(注意这里是发送release消息,而不是直接销毁里面的对象)。当给一个对象发送autorelease消息时,实际上是将该对象添加到NSAutorelease中。当自动释放池被销毁时,会给该对象发送release消息。当然,自动释放池也是一个正常的Objective-C对象,它也遵守引用计数规则。下面有两个例子,可以比较清晰的展示自动释放池的工作现象。


#import <Foundation/Foundation.h>

@interface RetainTracker : NSObject
@end 

@implementation RetainTracker

- (id) init
{
	if (self = [super init]) {
		NSLog (@"init: Retain count of %d.",
			   [self retainCount]);
	}
	
	return (self);
	
} 


- (void) dealloc
{
	NSLog (@"dealloc called. Bye Bye.");
	[super dealloc];
	
} 

@end




int main (int argc, const char * argv[])
{
    NSAutoreleasePool *pool;
    pool = [[NSAutoreleasePool alloc] init];
	
    RetainTracker *tracker;
    tracker = [RetainTracker new]; // count: 1
	
    [tracker retain]; // count: 2
    //把tracker加入到自动释放池中
    [tracker autorelease]; // count: still 2
    [tracker release]; // count: 1
	
    NSLog (@"releasing pool");
    [pool release]; 
	
    return (0);
}


#import <Foundation/Foundation.h>

@interface RetainTracker : NSObject
@end 

@implementation RetainTracker

- (id) init
{
	if (self = [super init]) {
		NSLog (@"init: Retain count of %d.",
			   [self retainCount]);
	}
	
	return (self);
	
} 


- (void) dealloc
{
	NSLog (@"dealloc called. Bye Bye.");
	[super dealloc];
	
} 

@end




int main (int argc, const char * argv[])
{
    NSAutoreleasePool *pool;
    pool = [[NSAutoreleasePool alloc] init];
	
    RetainTracker *tracker;
    tracker = [RetainTracker new]; // count: 1
	
    [tracker retain]; // count: 2
    [tracker retain]; // count: 3

    //把tracker加入到自动释放池中
    [tracker autorelease]; // count: still 3
    [tracker release]; // count: 2
	
    NSLog (@"releasing pool");
    [pool release]; 
	
    return (0);
}

请读者自行比较两段代码的输出。


Cocoa内存管理规则:

1.当你使用new、alloc、copy方法创建一个对象时,该对象的保留计数器值为1。当不再使用该对象的时候,你要负责向该对象发送一条release或autorelease消息。这样,该对象将在其使用寿命结束时被摧毁。

2.当你通过任何其他方法获得一个对象时,你不需要执行任何操作来确保该对象被清理。就比如这样的语句:NSMutableArray *array = [NSMuableArray arrayWithCapacity:17];你不需要维护array的引用计数,系统会帮你完成(借助于自动释放池)。当然,如果你打算在一段时间内拥有array,你需要给它增加引用计数,并且在不使用的时候减少引用计数。

3.如果你保留了某个对象,你需要释放或者自动释放该对象。必须保持retain方法和release方法的使用次数相等(就必须开始讨论的set方法)。


最后说明两个问题:

1.开始的set方法并没有确保对象销毁时,它的属性对象也销毁,处理的方式很简单,在对象的dealloc方法中,给属性对象发送release。

2.自动释放池也不是可以乱用的,比如在循环中,我们不断的新建对象,而且对象被加载到自动释放池中。那么,当循环很大的时候,被加载到自动释放池的对象并没有被释放,我们的程序占用的内存会持续增长。这时候的处理方法是不断的创建自己的自动释放池,然后释放(释放的时候,里面的对象也跟着释放了),再创建,再释放。


大数据运维面试题及答案 1. 架构组成:- 2 个 NameNode(Active 活跃节点、Standby 备用节点),实时同步元数据(通过 JournalNode 集群,默认 3 个节点,存储 edits 日志,Active 写入、Standby 读取以保持元数据一致);- 容错性强:通过 RDD 的 “ lineage(血缘)” 机制,任务失败时可快速重算,无需从头执行。:集群 “大脑”,管理元数据(文件目录、块位置),实时响应客户端请求,数据存于内存,元数据镜像(fsimage)和编辑日志(edits)持久化到磁盘; 阅读详情

相关推荐

当我们谈论Unidbg时我们在谈什么

文章目录一、前言二、使用Unidbg的工作量是什么三、补环境补的是什么3.1 运行环境缺失3.2 上下文缺失四、Unidbg 不是所有情况下最优的解决方案五、Unidbg在大多数情况下是好的方案六、Unidbg和风控无关七、尾声 一、前言 这是一篇漫谈Unidbg的文章,我对Unidbg的使用和理解都还很浅,日后会更新或修改看法,欢迎大佬指点,也期待同侪讨论。 二、使用Unidbg的工作量是什么 我们常规使用Frida + IDA的动静态分析中,工作可能是这样的 找线索→Frida Hook验证→验证成功继

lilac的博客 5788

Java的内存泄漏

Java的内存泄漏内容:问题的提出Java是如何管理内存什么是Java中的内存泄露如何检测内存泄漏相关资源关于作者相关内容:TCP/IP 介绍TCP/IP 介绍 -->

Piggy and Jery 's GOLB 2302

广工计组实验f2一位全加器

一位全加器实验

weixin_63692154的博客 2847

iOS内存管理之超级大坑-内存泄漏

除了ARC和MRC混合,有时候还有很多底层库是使用C/C++实现的,而且这些库中也涉及一些OC方面的库类调用,这样的情况就又复杂一点了。 = =,所以C/C++的内存管理也是需要有所了解滴~~~

骑着蜗牛找马儿 6676

思科模拟器-实验16:三层交换 VLAN 互访配置

【实验内容】 (1)按实验线路连接图进行连接。按照实验线路连接图分别配置各台计算机IP 地 址。 (2) 按照实验线路连接图,在SW1和SW2上分别完成VLAN配置,并在VLAN中添加相应的端口成员,同时配置Trunk端口。同时测试各计算机之间是否可以相互ping 通。 Switch>en Switch#config t Enter configuration commands, one per line. End with CNTL/Z. Switch(config)#vlan 10 Switc

weixin_44270194的博客 4727

基于Arduino与Velostat的智能鞋垫:DIY足底压力监测系统全解析

压力传感器是物联网和健康监测领域的基础元件,其核心原理是将物理压力转换为可测量的电信号。通过压阻效应,材料的电阻值随压力变化,从而实现压力感知。这项技术为低成本、定制化的健康监测方案提供了可能,尤其在运动分析和康复训练中具有重要价值。本文聚焦于利用Velostat压敏材料和Arduino平台,详细解析如何从传感器制作、信号调理到无线数据传输,构建一套完整的足底压力监测系统。文中深入探讨了传感器阵列构建、信号滤波等关键技术,并针对常见问题提供了实用的解决方案,为创客和开发者实现可穿戴健康监测设备提供了清晰的工

weixin_32818781的博客 400

避免内存泄露的方法

避免内存泄露的方法

604

SAR ADC设计——SAR Logic原理

SAR ADC设计——SAR Logic原理 参考:集成电路设计实践 SAR ADC 清华大学 李福乐 文章目录SAR ADC设计——SAR Logic原理一. Overview二. TSPC(True Single Phase Clock)三. SC_Gen(Sequential Control Generator)四. LATCH_Dynamic五. 时序控制逻辑总结六. SW产生七. DO产生八. GT产生九. SAR Logic模块总结 一. Overview 输入:CKC,CompB,SAMPL

夏风喃喃的博客 1万+

iphone开发中内存问题汇集

做iphone程序开发的朋友常常被内存泄露问题烦恼,毕竟,作为一个移动手机,资源是有限的,因此开发的时候要特别留意对象的创建和释放问题,下面是小弟自己总结的一些方法,提出来和大家共同探讨一下:1.在函数体中,alloc一个临时对象,及时release掉它,确保函数体内部不存在内存泄漏。2.autorelease效率不高,所以能自己release的地方,尽量自己release,不要随便交给autorelease来处理。3.获得所有权的函数要和释放所有权的函数一一对应。4.保证只有带alloc, copy, r

Arrui的专栏 2598

Agisoft Metashape 基于RTK技术的无人机航测免像控技术流程

利用无人机进行航空摄影测量,其使用方便、快速获得成果,已经是测绘行业外业生产的主要方式。RTK定位系统的出现,其厘米级的定位系统,使得航测无人机在作业时,能够准确获取拍照时的GPS位置,能够大量减少像控点,即使不使用像控点也能满足规范对精度的要求。可以有效解决特殊地形(如山川、峡谷、河流、沼泽、水库等)外业人员很难布设像控点的情况。

penglu366366的博客 2188

用 SAP-ABAP-1 把 ABAP 代码理解这件事交给 AI:从遗留代码到 ABAP Cloud 的开发加速器

SAP-ABAP-1是SAP推出的首个专用ABAP基础模型,专注于理解和解释ABAP代码,帮助开发者更快迁移和维护遗留系统。它强调ABAP Cloud合规编码实践,通过SAP AI Foundation提供访问,主要能力包括代码解释、业务语义理解和框架约束分析。相比通用模型,它能更好处理ABAP特有的版本差异、权限控制和扩展边界等问题。该模型可集成到多种开发环境中,支持文件化开发体验,并能与SAP Joule等工具协同工作,为ABAP团队提供智能辅助。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 3823

iPhone实战:在开发过程中我们要注意什么

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33974433的博客 129

【数字IC基础】DFT(Design For Test)可测性设计

【数字IC基础】DFT(Design For Test)可测性设计

努力,加油每一天鸭~ 3465

iPhone开发内存管理之一

    移动开发的特点:资源的有限性。作为手持设备,iphone的内存与传统的PC不可同日而语,这就要求我们在开发IOS程序的过程中,首要也是最重要的任务就是解决内存释放问题,本文将在网络上搜集的关于内存管理的经验予以分享。    开发iPhone 应用程序并不难,基本上就是三个词 - “memory, memory, memory” 。iPhone OS 对内存的要求很严格,有memory leak ,杀掉;内存使用超限额,杀掉。一个经过测试的程序,在使用过程中90%以上的崩溃都是内存问题造成的。在这里简

pjk1129专栏 2630

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

iPhone开发内存管理

开发iPhone 应用程序并不难,基本上就是三个词 – “memory, memory, memory” 。iPhone OS 对内存的要求很严格,有memory leak ,杀掉; 内存使用超限额,杀掉。一个经过测试的程序,在使用过程中90%以上的崩溃都是内存问题造成的。在这里简单总结一下Object-C 内存管理。 基本概念 Object-C 的内存管理基于引用计数(Reference...

weixin_30307921的博客 82

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

iPhone开发中的内存管理

移动开发的特点:资源的有限性。作为手持设备,iphone的内存与传统的PC不可同日而语,这就要求我们在开发IOS程序的过程中,首要也是最重要的任务就是解决内存释放问题,本文将在网络上搜集的关于内存管理的经验予以分享。     开发iPhone 应用程序并不难,基本上就是三个词 - “memory, memory, memory” 。iPhone OS 对内存的要求很严格,有memory

yangtb2010的专栏 663

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

iPhone开发过程中我们要注意什么

iPhone实战:在开发过程中我们要注意什么 经过一段长时间的iPhone开发,本人对iPhone的开发有了更进一步的了解,今天特意在此总结出一些可行性的实践,主要是针对在开发过程中也许会碰到的问题提出的一些解决方法以及需要注意的地方。下面说的都并非是最佳实践(本人还不够官方,呵呵),但确实是需要引起我们的注意,也值得作为参考。 1、要养成有借有还的习惯。 这里指的是内存管理方面的问题,我们

676

【引用】iPhone开发内存管理

原文地址:http://www.robinlu.com/blog/archives/392  开发iPhone 应用程序并不难,基本上就是三个词 - “memory, memory, memory” 。iPhone OS 对内存的要求很严格,有memory leak ,杀掉; 内存使用超限额,杀掉。一个经过测试的程序,在使用过程中90%以上的崩溃都是内存问题造成的。在这里简单总结一下Object

飞落的眼泪的专栏 862

iPhone开发资料之内存管理

开发iPhone 应用程序并不难,基本上就是三个词 - “memory, memory, memory” 。iPhone OS 对内存的要求很严格,有memory leak ,杀掉;内存使用超限额,杀掉。一个经过测试的程序,在使用过程中90%以上的崩溃都是内存问题造成的。在这里简单总结一下Object-C 内存管理。   基本概念   Object-C 的内存管理基于引用计数(Refer...

RbBtSn0w 124

iphone内存管理的具体问题解决方案

 iPhone 开发内存管理开发iPhone 应用程序并不难,基本上就是三个词 - “memory, memory, memory” 。iPhone OS 对内存的要求很严格,有memory leak ,杀掉; 内存使用超限额,杀掉。一个经过测试的程序,在使用过程中90%以上的崩溃都是内存问题造成的。在这里简单总结一下Object-C 内存管理。基本概念 Object-C 的内

彬琪 的 Iphone笔记 1893

iphone内存管理

<br /><br />开发iPhone 应用程序并不难,基本上就是三个词 - “memory, memory, memory” 。iPhone OS 对内存的要求很严格,有memory leak ,杀掉; 内存使用超限额,杀掉。一个经过测试的程序,在使用过程中90%以上的崩溃都是内存问题造成的。在这里简单总结一下Object-C 内存管理。基本概念<br />Object-C 的内存管理基于引用计数(Reference Count)这种非常常用的技术。简单讲,如果要使用一个对象,并希望确保在使用期间对象不

xianghuibeijing的专栏 762
上一篇: Iphone开发(5) retain,release,retainCount,dealloc
下一篇: java new IO
coding_or_coded
博客等级 码龄16年 216粉丝 115原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值