iPhone:奇怪的泄漏

时间:2011-06-04 05:05:02

标签: iphone memory-leaks

好的,下面的问题已经解决,但现在它为这个块创建了泄漏

NSMutableArray *tempRowArray=[[NSMutableArray alloc] init];
    [tempRowArray addObject:[NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 1)]];
    [pickerList addObject:tempRowArray];
    [tempRowArray release];

表示tempRowArray

啊,我在这段记忆中迷失了。

解决: 您好,

你可以帮助我吗,我有以下条件

1)在.h文件中声明了一个数组 2)创造属性并合成它 3)在viewWillAppear分配的内存中

pickerList = [[NSMutableArray alloc] init];

4)从数据库中读取数据并在此数组中存储对象

if (sqlite3_prepare(database, sqlStatement, -1, &compiledStatement, NULL) == SQLITE_OK) {

    while (sqlite3_step(compiledStatement) == SQLITE_ROW) {

        NSMutableArray *tempRowArray=[[NSMutableArray alloc] init];
        [tempRowArray addObject:[NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 1)]];
        [pickerList addObject:tempRowArray];
        [tempRowArray release];
    }
}

选择器列表显示为内存泄漏 和应用程序最终崩溃一段时间后请帮我摆脱它

5)我在dealloc()中发布了 pickerList ,并在viewDidUnload

中将其设置为nil

3 个答案:

答案 0 :(得分:4)

每次出现视图时,您都会分配pickerList。在viewDidLoad中分配,然后在viewDidUnload中发布。

答案 1 :(得分:2)

viewWillAppear中,您正在分配内存。如果您正在切换到此视图控制器,那么您的viewWillAppear将被调用,您将一次又一次地分配内存。

viewDidLoad中执行,并在分配时使用其属性。

答案 2 :(得分:2)

使用合成的setter方法在viewDidLoad

中设置数组
self.pickerList=[NSMutableArray array];

并在nil

中将其设为viewDidUnload
self.pickerList = nil;

您收到泄密的原因是因为您可能在pickerList = nil

中呼叫viewDidUnload

pickerList = somethingself.pickerList = something之间存在差异。在第一个实例中,您直接设置值,但如果您使用第二个版本(并且您已声明@property (retain) NSMutableArray *pickerList,则@synthesized setter方法将保留新值并释放旧值。

在你的情况下,只需在viewDidUnload中将其设置为nil就会丢失指向原始对象的指针,因此你无法释放它,并且你有泄漏。