繁体   English   中英

iPhone应用程序中的内存泄漏

[英]Memory leaks in iphone application

嗨,大家好! 我是iPhone开发的新手。 我的内存泄漏有问题。 我有这样的代码。

do {

    int s = sqlite3_step(statement);
    switch (s) {
        case SQLITE_ROW:{

            Article *a = [[[Article alloc] init] autorelease];
            for (int i = 0; i < columnCount; i++) {
                const char *columnName = sqlite3_column_name(statement, i);
                if(strncmp(columnName, "title", strlen("title")) == 0){
                    const char* colStr = (char*)sqlite3_column_text(statement, i);
                    if(colStr != NULL)
                        a.title = [[[NSString alloc] initWithCString: colStr encoding:NSUTF8StringEncoding] autorelease];
                    continue;
                }
                if(strncmp(columnName, "author", strlen("author")) == 0){
                    const char* colStr = (char*)sqlite3_column_text(statement, i);
                    if(colStr != NULL)
                        a.author = [[[NSString alloc] initWithCString:colStr encoding:NSUTF8StringEncoding] autorelease];
                    continue;
                }
                if(strncmp(columnName, "description", strlen("description")) == 0){
                    const char* colStr = (char*)sqlite3_column_text(statement, i);
                    if(colStr != NULL)
                        a.description = [[[NSString alloc] initWithCString:colStr encoding:NSUTF8StringEncoding] autorelease];
                    continue;
                }
                if(strncmp(columnName, "link", strlen("link")) == 0){
                    const char* colStr = (char*)sqlite3_column_text(statement, i);
                    if (colStr) 
                        a.link = [[[NSString alloc] initWithCString:colStr encoding:NSUTF8StringEncoding] autorelease];
                    continue;
                }
                if(strncmp(columnName, "imageUrl", strlen("imageUrl")) == 0){
                    const char* colStr = (char*)sqlite3_column_text(statement, i);
                    if (colStr)
                        a.imageUrl = [[[NSString alloc] initWithCString:colStr encoding:NSUTF8StringEncoding] autorelease];
                    continue;
                }
                if(strncmp(columnName, "pubDate", strlen("pubDate")) == 0){
                    const char* colStr = (char*)sqlite3_column_text(statement, i);
                    if(colStr)
                        a.pubDate = [[[NSString alloc] initWithCString:colStr encoding:NSUTF8StringEncoding] autorelease];
                    continue;
                }
            }
            [array insertObject:a atIndex:0];
        }
        break;
        case SQLITE_DONE:
            sqlite3_finalize(statement);
            dataForReadingAvailable = NO;
            break;
        default:{
            NSLog(@"getArticlesForFeed:sqlite3_step failed.Error:%s",sqlErrMsg);
            return nil;
        }
        break;
    }   
}while(dataForReadingAvailable);

Xcode的工具显示,当我分配了对象并对其进行初始化时,我有泄漏内存。 但是为什么会这样。 所有对象都是自动释放的,因此我认为不会出现这种情况。 谢谢。

我认为也许您在某处用新指针覆盖了分配的内存。

我会取代

Article *a = [[[Article alloc] init] autorelease];

Article *a = [[Article alloc] init];
//some code
[a release]; //when you don't need it anymore

过多使用自动释放不是一个好习惯。 万一有很多对象,它甚至可能减慢您的应用程序的速度。 和像

 a.title = [[[NSString alloc] initWithCString: colStr encoding:NSUTF8StringEncoding] autorelease];

我将替换为

 a.title = [NSString stringWithCString:colStr encoding:NSUTF8StringEncoding];

在这种情况下,您还依赖于自动释放池,但这要简单得多。

编辑:的确,您的“文章”分配处于do-while循环中。 在字符串[array insertObject:a atIndex:0]中; 您的aray保留了对象,并且您不再需要它,但是您依赖于自动释放。 分析器(或使用的工具)看到的是,您将分配放置在循环的主体中,而没有在每次迭代后释放它。 这样,在循环的第二次迭代中,您将覆盖“ a”对象,从而丢失旧指针并以这种方式泄漏内存(由于“ a”被覆盖,因此池找不到该指针)。 即使您只通过一次循环,分析仪也不会在意并发出警告。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM