我有两个UIViewController
,在prepareForSegue
方法中,我想在它之间传递一个NSMutableArray
。
其实我做的是这样的事情:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
MySecondVC *secondVC = segue.destinationViewController;
secondVC.myArray = [[MyClass alloc] getSomeItemsFromDB];
}
}
现在问题是myArray
非常大,经过三次推送和弹出后我得到了这个错误:
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Could not load NIB in bundle: 'NSBundle </var/mobile/Applications/A29F6321-4C1C-4DA4-AC4E-EDA5FF7F96F5/TrainingTime2.app> (loaded)' with name 'Wx6-7E-i1q-view-mNF-OU-Ouz' and directory 'Main.storyboardc''
*** First throw call stack:
([...])
libc++abi.dylib: terminating with uncaught exception of type NSException
我想这是因为我使用了太多内存,是这样吗?
我也尝试在viewDidLoad
方法中从我的数据库中获取数据,但结果是一样的。
有什么建议吗?
该数组包含大约15个项目。 我用这种方法找到的大小是616,但我不知道它是否已经正确计算。
size_t size = class_getInstanceSize([EsercizioPerScheda class]);
for (id obj in self.listaEsercizi) {
size += class_getInstanceSize([obj class]);
}
NSLog(@"%zu", size);
我试过这个
- (void)viewDidDisappear:(BOOL)animated {
[self setMyArray:nil];
}
但没有任何改变。
我已经修复了这个问题并对我的查询进行了一些改进,现在应用程序在20/25推送和弹出后崩溃,但我想学习如何防止这类问题。
你们是否可以建议一些关于如何在视图控制器之间正确传递数据,声明数组等的教程?
答案 0 :(得分:1)
这不太可能被数组调用。
并且您不会在Objective-C中释放对象。您删除对它们的引用,并在最后一个引用消失时自动释放对象。
答案 1 :(得分:1)
如果您使用的内存过多,我建议您只填充表视图中需要的那些行。
因此,您需要在tableview数据源方法中构建数据库查询基础结构,并仅获取所需的行。您可能希望包含少量缓存以避免过于频繁地访问数据库。
您需要使用OFFSET
和LIMIT
子句来获取所需数据的子集(可能需要进行舍入以获得值以提高性能的页面)。也不要为每个查询打开/关闭数据库,因为这会破坏性能。
这显然会增加应用程序的复杂性(很多),但这是在有限内存环境中发生的,无法避免。
答案 2 :(得分:0)
您可以使用Instruments检查应用消耗的内存量。您可以在此处找到有关如何使用它的更多信息:http://www.raywenderlich.com/23037/how-to-use-instruments-in-xcode
一旦您在“工具”中对您的应用进行了分析,您就可以确定是否是您的阵列导致问题或其他原因。
答案 3 :(得分:0)
不能因为数组太大。如果你传递相同的NSMutableArray,只需将指针传递给同一个数组。我认为原因是你在没有init的情况下使用alloc:[[MyClass alloc] getSomeItemsFromDB];