转换到iOS 5时需要注意什么

Ste*_*dle 28 memory-management ios ios5

简介: 您可以添加到我的迁移到iOS 5时要注意的事项清单吗? StackOverflow一直非常宝贵,因为我已经开始升级到iOS 5.我发现了一些在Xcode 4.2之前我错过的非常基本的东西,我想知道其他"陷阱"可能潜伏着什么.

细节:本周iOS 5发货,我不得不对我的几个应用程序进行一些更改.由于新的ARC功能,Xcode 4.2在分析内存管理代码方面做得更好.iOS 5更新是查看所有内存管理代码的重要点.新编译器还发现了早期编译器遗漏的许多其他问题.感谢Apple编译工程师.以下是有帮助的主要内容(其中许多内容也适用于早期版本的iOS).

  1. 确保在dealloc方法的END处调用[super dealloc],而不是在开头.
  2. 在viewDidUnload中,有些人报告了需要在viewDidUnload 的末尾而不是开头调用[super viewDidUnload]的错误.
  3. 了解保留计数,合成设置器以及何时调用释放或自动释放.新编译器将指出比旧编译器更多的问题.(我以为我一直很小心,但显然我不够小心.)Apple的内存管理指南是必读的 - 没有捷径.
  4. 在调试时打开僵尸是个好主意(在Xcode中,选择Product | Edit Scheme ...并选择Debug方案;在Diagnostics选项卡上,选中Enable Zombie Objects).这可以帮助您找到僵尸的尝试使用(您不应再使用的对象).
  5. 泄漏仪器也很有帮助.在配置文件模式下运行您的应用程序,然后选择Leaks模板.在"仪器"窗口中,选择"泄漏"仪器并选中"收集泄漏的内存内容"框,它将帮助您查看泄漏的内存源自代码的位置.

我遇到过一些可能的结果:

  • Apple的单例模式需要在返回类型声明中添加"oneway":
    - (oneway void) release { }

我应该寻找潜在陷阱的任何其他建议吗?我觉得我的应用程序现在更加稳定,但我之前觉得它们相当不错.

Sul*_*han 6

1 /如果要更改大小,模态控制器的行为会有所不同.如果您需要不同大小的模态对话框,请考虑使用iOS 5子视图控制器.

2 /对于一个表,如果你返回nil节标题和正高度,在iOS 4中,标题被隐藏了.在iOS 5中,您必须为nil标头返回零高度.

3/UDID已弃用.您可以使用CFUUIDCreate创建唯一ID并将其保存到您的设置中,但请注意,可以备份设备数据,然后将其还原到其他设备,从而使您拥有两个具有相同ID的设备.我通过使用属性kSecAttrAccessibleWhenUnlockedThisDeviceOnly将我的id保存到keychain来解决了这种情况.

关于列表:[super viewDidUnload]应始终作为viewDidUnload中的最后一个语句调用.逻辑与[super dealloc]中的逻辑相同.注意,你也应该在你的dealloc中调用[self viewDidUnload](如果你还没有在那里释放你的内存),因为它不是隐式调用的(虽然有时是).

根据我的实验,仪器中的泄漏检测不会报告在未指定属性名称的情况下合成的属性的泄漏.

  • 通常,如果您使用ARC并且IBOutlet很弱,则在卸载视图时会卸载所有内容.但是如果没有ARC和强大的(保留)IBOutlets(例如,如果要从视图中动态添加和删除它们),则需要在viewDidUnload中释放它们.但是,您也想在dealloc方法中释放它们.要删除代码双重性,只需从dealloc调用viewDidUnload.您应该将它放在那里,因为在释放视图控制器时不会自动调用它. (3认同)