过渡到 iOS 5 时要注意啥
Posted
技术标签:
【中文标题】过渡到 iOS 5 时要注意啥【英文标题】:What to watch out for when transitioning to iOS 5过渡到 iOS 5 时要注意什么 【发布时间】:2011-12-08 02:53:27 【问题描述】:总结: 您能否将迁移到 ios 5 时需要注意的事项添加到我的清单中? *** 在我升级到 iOS 的过程中非常宝贵5. 我发现了一些在 Xcode 4.2 之前我错过的非常基本的东西,我想知道可能还有什么其他“陷阱”。
详细信息:随着本周 iOS 5 的发布,我不得不对我的几个应用程序进行一些更改。由于新的 ARC 功能,Xcode 4.2 在分析内存管理代码方面做得更好。 iOS 5 更新是查看所有内存管理代码的好时机。新编译器还发现了早期编译器遗漏的许多其他问题。感谢 Apple 编译器工程师。以下是有帮助的主要内容(其中许多也适用于早期版本的 iOS)。
-
确保call [super dealloc] at the END of your dealloc methods,而不是开始。
在 viewDidUnload 中,some people have reported bugs that require [super viewDidUnload] to be called at the end,不是您 viewDidUnload 的开始。
了解保留计数、综合设置器以及何时调用释放或自动释放。新的编译器会比旧的编译器指出更多的问题。 (我以为我很小心,但显然我不够小心。)Apple 的memory management guide 是必读的——没有捷径。
turn on zombies when debugging 是个好主意(在 Xcode 中,选择 Product | Edit Scheme... 并选择 Debug scheme;在 Diagnostics 选项卡上,选中 Enable Zombie Objects)。这可以帮助您找到僵尸的尝试用途(您不应该再使用的对象)。
Leaks 工具也很有帮助。在配置文件模式下运行您的应用程序并选择泄漏模板。在 Instruments 窗口中,选择 Leaks 工具并选中“Gather Leaked Memory Contents”复选框,它将帮助您查看代码中泄漏内存的来源。
我遇到了一些零碎的事情:
Apple 的 singleton pattern 需要在返回类型声明中添加“oneway”: - (oneway void) 释放 您可能需要在构建设置中manually add "armv6" as an architecture type(并确保将“仅构建活动架构”设置为“否”)。我应该寻找任何其他关于潜在陷阱的建议吗?我感觉我的应用现在更稳定了,但我以前对它们感觉很好。
【问题讨论】:
这不是内存管理,但无论如何它很重要:如果您下载任何数据并希望将其存储在设备上,请注意不要将其保存到文档文件夹中。为此使用库/缓存或 tmp。或者将应用程序数据存储到 NSApplicationSupportDirectory 并附加您的捆绑包 ID。详情请参阅developer.apple.com/library/mac/#documentation/FileManagement/…。 也不是内存管理。但是,如果您正在做与安全/证书相关的事情。请注意,MD5 散列证书在 SecTrustEvaluate 上返回 kSecTrustResultRecoverableTrustFailure。因为 ios5 认为 MD5 哈希不安全。 迁移到 IOS5 的另一件事是已弃用的 UDID。 ***.com/questions/6993325/… 【参考方案1】:1/ 模态控制器的行为不同,如果你改变它们的大小。如果您需要不同大小的模态对话框,请考虑使用 iOS 5 子视图控制器。
2/ 对于表格,如果您返回 nil 部分标题和正高度,在 iOS 4 中,标题是隐藏的。在 iOS 5 中,您必须为 nil 标头返回零高度。
3/ UDID 已弃用。您可以使用 CFUUIDCreate 创建唯一 id 并将其保存到您的设置中,但请注意,可以备份设备数据然后将其恢复到另一台设备,从而为您留下两个具有相同 id 的设备。我通过将我的 id 保存到属性为 kSecAttrAccessibleWhenUnlockedThisDeviceOnly 的钥匙串中解决了这种情况。
关于您的清单: [super viewDidUnload] 应始终作为 viewDidUnload 中的最后一条语句调用。逻辑与[super dealloc]中的相同。请注意,您还应该在您的 dealloc 中调用 [self viewDidUnload](如果您还没有在那里释放您的内存),因为它不会被隐式调用(尽管有时是这样)。
根据我的实验,Instruments 中的泄漏检测不会报告在未指定属性名称的情况下合成的属性的泄漏。
【讨论】:
感谢您的回答。你能为我澄清一些事情吗?我认为我们在何时调用 [super viewDidUnload] 的问题上说的是同样的话。此外,它会改善您的答案,以更清楚地说明您应该调用 [self viewDidUnload] 的情况的建议。 一般来说,如果你使用 ARC 并且你的 IBOutlets 很弱,当视图被卸载时,所有的东西都会被卸载。但是如果没有 ARC 和强(保留)IBOutlets(例如,如果您从视图中动态添加和删除它们),您希望在 viewDidUnload 中释放它们。但是,您还想在您的 dealloc 方法中释放它们。要删除代码重复,您只需从 dealloc 调用 viewDidUnload。你应该把它一直放在那里,因为它不会在视图控制器被释放时自动调用。以上是关于过渡到 iOS 5 时要注意啥的主要内容,如果未能解决你的问题,请参考以下文章