原文作者:
http://www.cnblogs.com/speeding/archive/2011/07/13/2105309.html
在做一个TableView程序时,要在表格里显示一个文件夹内所有文件的清单,程序在一开始显示时正常,但是一滚动窗口时就崩溃,查找这个错误整整花了我一天的时间,原来出在NSMutableArray初始化时用的方法不正确,都是因为Objective-C的基础知识没学好。
在一个UITableViewController类中声明了一个NSMutableArray *localFiles这样一个数组,作为成员变量。
在viewDidLoad方法中读出应用程序Documents目录下的所有文件名放在这个数组中,初始化时用了这个方法:
localFiles = [NSMutableArray array]; //这是自动释放的对象
然后循环调用了addObject方法,其它就没有什么特殊的操作了,程序能够显示出一个文件列表,但向上或向下滚动一点点时,程序就崩溃,显示的错误信息也相当奇怪:
[__NSArrayI addObject:]: unrecognized selector sent to instance 0x4b1b8b0
我查啊查啊,每次出错的调用栈都显示在执行到cellForRowAtIndexPath这个方法时出错,跟踪到localFiles这个变量时,在调试器上显示out of scope,这个localFiles指针里的内容不知道跑到哪里去了。
从google上查了许多资料,在这个网站的留言中查到下面一段话,顿时茅塞顿开:
It doesn't really matter. [NSMutableArray array] is a nice shortcut, but you have to remember to retain it, so the question really is a matter of [[NSMutableArray array] retain] versus [[NSMutableArray alloc] init]. I usually use the former. The real convenience comes in when you need to statically fill the array; you can do it all in one message. [[NSMutableArray arrayWithObjects:...] retain] is faster than [[NSMutableArray alloc] init] followed by numerous [NSMutableArray addObject:(id)] calls.
原来在调用array方法后得retain!或者改用[[NSMutableArray alloc] init]方法组合,试了2种修改办法果然都好用,程序再也不崩溃了。就这么几个字,害了我几乎一整天。
localFiles = [[NSMutableArray array] retain];
这一天里恶补了一些Objective-C中的内存管理知识,虽然走了一些弯路,但对AutoRelease这个术语算是有了一些认识了。
后来仔细看了《Objective C教程》的第9章“内存管理”,原来第9.3节“Cocoa内存管理规则”(第138页)里作者早就强调三条规则:
(1)当你使用new、alloc或copy方法创建一个对象时,该对象的引用计数器值为1。当不再使用该对象时,你要负责向该对象发送一条release或autorelease消息。这样,该对象将在其使用寿命结束时被销毁。
(2)当你通过任何其它方法获得一个对象时,则假设该对象的引用计数器值为1,而且已经被设置为自动释放,你不需要执行任何操作来确保该对象被清理。如果你打算在一段时间内拥有该对象,则需要保留(retain)它并确保在操作完成时释放它。
(3)如果你保留(retain)了某个对象,你需要(最终)释放或自动释放该对象。必须保持retain方法和release方法的使用次数相等。
我的程序是iPhone程序,为了降低程序的内存空间占用,Cocoa在GUI应用程序中规定了自动释放池的销毁时间,在程序开始处理事件之前创建一个自动释放池,并在事件处理结束后销毁该自动释放池。我的localFiles对象在开始时创建了一个自动释放对象,完成之后进行下一个事件循环,自动释放池已经销毁,localFiles对象也就被释放了,在滚动tableView时进入下一个事件循环,所以localFiles对象的内容就找不到了。
分享到:
相关推荐
Java 内存结构备忘录 Java 内存结构是一个复杂的系统,包括堆内存模型、垃圾回收算法和处理内存泄露的最佳方案。Java 虚拟机(JVM)中存在 PermGen(内存永久保存区域), PermGen 中存储了常量池、字段与方法数据...
《企业备忘录管理系统》是基于Visual C++编程语言和SQL Server数据库技术开发的一款实用工具,旨在提升企业的信息管理效率。这款系统集成了多种功能,为企业的日常事务处理提供了便捷的解决方案。 首先,Visual C++...
在本项目中,"java课设--个人备忘录管理系统"是一个基于Java编程语言实现的课程设计项目,旨在提供一个方便用户记录、管理和检索个人备忘录的应用程序。这个系统通常包括用户界面、数据存储、备忘录的增删改查等功能...
《VC++企业备忘录管理系统详解》 在IT行业中,高效的信息管理是企业运营的关键,而VC++企业备忘录管理系统则为此提供了强大的解决方案。这个系统集成了身份验证、成员信息管理、类型管理、备忘录信息管理和查询管理...
备忘录管魔丹黒魔丹黒骑开发的备忘录管理软件发的备忘录管理软件备忘录管魔丹黒魔丹黒骑开发的备忘录管理软件发的备忘录管理软件备忘录管魔丹黒魔丹黒骑开发的备忘录管理软件发的备忘录管理软件备忘录管魔丹黒魔丹黒...
本项目名为"备忘录日程管理java代码",它是一个基于Java的软件,主要功能集中在帮助用户进行备忘录记录和日程管理。下面我们将深入探讨这个项目涉及到的关键知识点。 1. **Java基础**: - **面向对象编程**:Java...
任务管理备忘录PPT素材.pptx,任务管理备忘录PPT,适用于分析任务状态更新等各种情况,可以用在销售行业PPT中,项目汇报PPT中,任务管理PPT中,一个很像台历的任务管理备忘录,可以很清楚的罗列任务管理的完成情
包括家庭成员基本信息、备忘录配置信息、备忘录信息、备忘录信息查询的管理(生日提示、备忘录提示、大事记等),对学习VC+Oracle帮助很大,其中大部分代码摘自《Visusl C++与Oracle数据库编程案例》
总的来说,【备忘录信息管理系统】是一个集成了Swing GUI设计、数据库操作、安全策略和用户友好的功能于一身的应用,是学习Java桌面开发和数据库管理的好实例。开发者通过此项目不仅能够熟悉Swing组件的使用,还能...
《企业备忘录管理系统——C++与SQL Server的完美结合》 在当今信息化时代,企业的日常运作离不开各种信息管理工具。本文将详细探讨一个由C++编程语言与SQL Server数据库系统共同实现的企业备忘录管理系统,它为中小...
设计和实现一个类似个人...3.备忘录分类管理(根据时间段、类别等进行管理); 4.备忘录的闹铃提醒(例如某个月、某个星期或指定时间段的时间的闹铃提醒); 5.其他要求:界面设计应尽量美观,可以添加一些图片或背景。
3. **任务管理**:备忘录可能具备任务管理功能,用户可以设置任务的开始时间、结束时间,甚至可以设定提醒,确保不会错过任何重要的任务节点。 4. **标签系统**:通过标签系统,用户可以为不同的备忘录分配类别,如...
项目工程备忘录
综上所述,“备忘录,免费桌面备忘录,M备忘”是一个以用户体验为本的桌面应用程序,它集合了MFC框架的强大功能和ACCESS数据库的高效数据管理能力,为用户提供了简便快捷的备忘录服务。无论是日常生活中的待办事项,...
微信小程序 备忘录 (源码)微信小程序 备忘录 (源码)微信小程序 备忘录 (源码)微信小程序 备忘录 (源码)微信小程序 备忘录 (源码)微信小程序 备忘录 (源码)微信小程序 备忘录 (源码)微信小程序 备忘录 (源码)微信小...
同时,C++的内存管理和性能优化能力使得系统运行高效且稳定。 SQL,全称Structured Query Language,是用于管理关系数据库的标准化语言。在这个系统中,SQL可能被用来设计和操作数据库结构,包括创建数据表、定义...
【标题】:“备忘记事管理簿”是一款专为初学者设计的桌面记事应用,旨在帮助用户方便地记录和管理日常事务。 【描述】:这款小工具是开发者自创的,可能还存在许多不足,因此欢迎用户提出批评和建议以促进其改进。...
在J2ME中,由于资源有限,必须谨慎处理内存管理和性能优化。 6. **EclipseME开发环境**: EclipseME是一个强大的J2ME开发工具,它扩展了Eclipse IDE,提供了专门针对J2ME开发的特性,如模拟器支持、项目构建工具和...
在本文中,我们将深入探讨基于J2ME的RMS(Record Management System)记录管理系统,特别关注如何在S60及更高版本的移动设备上实现一个备忘录应用。这个系统对于初学者来说是一个很好的学习资源,因为它展示了如何...
候,困惑在内存管理的实现上,阅读这本书,希望能有利于自己的OS的编写。 4,克服惰性,多读书,希望一天能阅读5页,争取半年内阅读完这本原版700 多页的巨著。 不足: 我不可能完全理解LINUX内存管理的精髓,肯定有...