如何dealloc NSMutableArray

时间:2014-07-02 10:28:50

标签: objective-c xcode memory-management storyboard nsmutablearray

我有两个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推送和弹出后崩溃,但我想学习如何防止这类问题。

你们是否可以建议一些关于如何在视图控制器之间正确传递数据,声明数组等的教程?

4 个答案:

答案 0 :(得分:1)

这不太可能被数组调用。

并且您不会在Objective-C中释放对象。您删除对它们的引用,并在最后一个引用消失时自动释放对象。

答案 1 :(得分:1)

如果您使用的内存过多,我建议您只填充表视图中需要的那些行。

因此,您需要在tableview数据源方法中构建数据库查询基础结构,并仅获取所需的行。您可能希望包含少量缓存以避免过于频繁地访问数据库。

您需要使用OFFSETLIMIT子句来获取所需数据的子集(可能需要进行舍入以获得值以提高性能的页面)。也不要为每个查询打开/关闭数据库,因为这会破坏性能。

这显然会增加应用程序的复杂性(很多),但这是在有限内存环境中发生的,无法避免。

答案 2 :(得分:0)

您可以使用Instruments检查应用消耗的内存量。您可以在此处找到有关如何使用它的更多信息:http://www.raywenderlich.com/23037/how-to-use-instruments-in-xcode

一旦您在“工具”中对您的应用进行了分析,您就可以确定是否是您的阵列导致问题或其他原因。

答案 3 :(得分:0)

不能因为数组太大。如果你传递相同的NSMutableArray,只需将指针传递给同一个数组。我认为原因是你在没有init的情况下使用alloc:[[MyClass alloc] getSomeItemsFromDB];