【问题标题】:when is the memory released in this function这个函数什么时候释放内存
【发布时间】:2014-04-11 18:24:11
【问题描述】:

我有一个视图控制器,它调用另一个 nsobject 文件中的函数。

所以在我的主视图控制器中我调用了一个函数

[DatabaseFunctions FillArrays: 数组];

Array 是在视图控制器中初始化的 nsmutablearray。

在 DatabaseFunctions.h 中

+ (void) FillArrays : (NSMutableArray*) Array;

在 DatabaseFunctions.m 中

+ (void) MainScreenFill : (NSMutableArray*) Array{
    sqlite3_stmt *statement;

    if (sqlite3_open([dbDatabasePath UTF8String], &TableDB)==SQLITE_OK) {
        [Array removeAllObjects];

        NSString *querySql = [NSString stringWithFormat:@"SELECT VARIABLE, VARIABLE1, VARIABLE2, VARIABLE3 FROM TABLE];
        const char* query_sql = [querySql UTF8String];

        if (sqlite3_prepare(TableDB, query_sql, -1, &statement, NULL)==SQLITE_OK) {
            while (sqlite3_step(statement)==SQLITE_ROW)
            {
                MainTableView *P = [[MainTableView alloc]init];
                [P setFirstname:[NSString stringWithUTF8String:(const char *)sqlite3_column_text(statement, 0)]];
                [P setSecondname:[NSString stringWithUTF8String:(const char *)sqlite3_column_text(statement, 1)]];
                [P setClass:[NSString stringWithUTF8String:(const char *)sqlite3_column_text(statement, 2)]];

                [Array addObject:P];
            }
        }
    }
    sqlite3_close(TableDB);
}

我的问题是内存分配 MainTableView *P = [[MainTableView alloc]init];解除分配?

【问题讨论】:

  • P 多次发布。你真的是想问什么时候会被释放?
  • 仅供参考 - 标准约定是只有类名使用大写字母。方法名和变量名应以小写字母开头。
  • 是的,我的意思是取消分配对不起

标签: objective-c memory-management


【解决方案1】:

根据 Apple 在Memory Management 上的文档:

当保留计数变为零时,对象被释放(销毁)。

在您描述的场景中,分配给 P 的任何变量都不会被释放,因为您正在将它添加到数组中。该数组保持对您的对象的强引用,因此在该引用被破坏之前它不会被释放(直到您从数组中删除对象,或者数组本身被释放)。

【讨论】:

  • 因此,如果将其添加到数组中,则会在视图控制器中创建该数组。当我离开视图控制器(切换屏幕)时,它会全部被删除吗?我有一个有多个视图的应用程序,切换视图会导致内存泄漏,我只是想确定在哪里。
  • 这取决于您的视图控制器是否被释放 - 如果它是导航堆栈的一部分,则旧的将不会被释放,直到它从堆栈中弹出(即,将一个压入顶部不会触发释放)。
  • im 使用以下代码切换视图 TableViewSelect *switchviews = [[TableViewSelect alloc] initWithNibName:nil bundle:nil]; [self presentViewController: switchviews animated:YES completion:NULL];
  • "self" 在这种情况下不会被释放。如果显示的视图控制器被关闭,它仍然在内存中。
  • 那么我该如何正确地做到这一点,大声笑,通过网络链接,这就是我找到的解决方案。您有机会发送链接教程或建议吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-12
  • 2012-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多