Parse.com iOS [PFObject saveAll] / [PFObject saveAllInBackground] 内存分配问题
Parse.com iOS [PFObject saveAll] / [PFObject saveAllInBackground] Memory Allocation Issue
提前致谢。每当我调用 [PFObject saveAll] 或 [PFObject saveAllInBackground] 时,分配给该进程的内存在任务完成后无法释放。因此,如果重复调用此方法,应用程序将因可用内存不足而崩溃。我正在使用 iOS 8.1.3 并使用 Xcode 6.2 和 ARC 在 iPhone 5 上进行测试。我也在为 iOS 使用最新的 Parse SDK,尽管这个问题在旧的 SDK 中仍然存在。
编辑
几周前我向 Parse 提交了错误报告。他们已经派人去调查了:https://developers.facebook.com/bugs/349439421926879/
错误的源代码:https://github.com/EpsApps/Parse-PFObject-saveAll-Memory-Bug
虽然每次 运行 对我来说都不一样,但有时内存占用会完全消失。查看下图。
我同意,大多数时候似乎还有某种残留物。
(来源:derrrick.com)
我已经找到解决此错误的方法。将对象添加为指针时,对该对象执行简单查询,而不是重复使用通过更复杂的查询提取的同一对象。
例如,当包含 "bigObject" 作为大保存的指针时,这将导致严重的内存泄漏:
PFQuery* query = [PFQuery queryWithClassName:@"Object"];
[query whereKey:@"objectId" equalTo:object.objectId];
// Don't include an array of pointers like this
[query includeKey:@"objectArray1"];
[query includeKey:@"objectArray2"];
PFObject* bigObject = [query getFirstObject];
但这不会:
PFQuery* query = [PFQuery queryWithClassName:@"Object"];
[query whereKey:@"objectId" equalTo:object.objectId];
PFObject* smallObject = [query getFirstObject];
提前致谢。每当我调用 [PFObject saveAll] 或 [PFObject saveAllInBackground] 时,分配给该进程的内存在任务完成后无法释放。因此,如果重复调用此方法,应用程序将因可用内存不足而崩溃。我正在使用 iOS 8.1.3 并使用 Xcode 6.2 和 ARC 在 iPhone 5 上进行测试。我也在为 iOS 使用最新的 Parse SDK,尽管这个问题在旧的 SDK 中仍然存在。
编辑
几周前我向 Parse 提交了错误报告。他们已经派人去调查了:https://developers.facebook.com/bugs/349439421926879/
错误的源代码:https://github.com/EpsApps/Parse-PFObject-saveAll-Memory-Bug
虽然每次 运行 对我来说都不一样,但有时内存占用会完全消失。查看下图。
我同意,大多数时候似乎还有某种残留物。
(来源:derrrick.com)
我已经找到解决此错误的方法。将对象添加为指针时,对该对象执行简单查询,而不是重复使用通过更复杂的查询提取的同一对象。
例如,当包含 "bigObject" 作为大保存的指针时,这将导致严重的内存泄漏:
PFQuery* query = [PFQuery queryWithClassName:@"Object"];
[query whereKey:@"objectId" equalTo:object.objectId];
// Don't include an array of pointers like this
[query includeKey:@"objectArray1"];
[query includeKey:@"objectArray2"];
PFObject* bigObject = [query getFirstObject];
但这不会:
PFQuery* query = [PFQuery queryWithClassName:@"Object"];
[query whereKey:@"objectId" equalTo:object.objectId];
PFObject* smallObject = [query getFirstObject];