在while循环中添加到数组时泄漏

| 我有一个名为:“ 0”的函数,此函数将sqlite数据库中的项目(文章)添加到“ 1”,此处此函数的工作方式:
- (void) AddSortedCustomFeed :(NSMutableArray*)rssList {    
    NSLog(@\"\\n\\n\\n ----- Add Sorted SQL Database -----\");
    NSLog(@\"Start\");
    // Create Query String.
    NSString* sqliteQuery = [NSString stringWithFormat:@\"SELECT mainLink, title, summary, pubDate, author, imageLink, body, favorites, pubdatetime FROM ARTICLES WHERE customfeed  = \'Y\' ORDER BY pubdatetime DESC\"];
    NSLog(@\"Query String is: %@\", sqliteQuery);
    // Pointer to Article and Statement.
    Article* article;
    sqlite3_stmt* statement;

    // Prepare SQL for work.
    if( sqlite3_prepare_v2(articlesDB, [sqliteQuery UTF8String], -1, &statement, NULL) == SQLITE_OK ) {
        // Get next row from database.
        while( sqlite3_step(statement) == SQLITE_ROW ) {
            // Alloc and init article.

            article = [[Article alloc] initWithValues:[NSString stringWithUTF8String:(const char*)sqlite3_column_text(statement, 1)] 
                                             mainLink:[NSString stringWithUTF8String:(const char*)sqlite3_column_text(statement, 0)] 
                                              summary:[NSString stringWithUTF8String:(const char*)sqlite3_column_text(statement, 2)] 
                                              pubDate:[NSString stringWithUTF8String:(const char*)sqlite3_column_text(statement, 3)] 
                                               author:[NSString stringWithUTF8String:(const char*)sqlite3_column_text(statement, 4)] 
                                            imageLink:[NSString stringWithUTF8String:(const char*)sqlite3_column_text(statement, 5)] ];


            //article.body      = [NSString stringWithUTF8String:(const char*)sqlite3_column_text(statement, 6)];
            NSString* favo    = [NSString stringWithUTF8String:(const char*)sqlite3_column_text(statement, 7)];
            article.favorite  = [favo hasPrefix:@\"N\"] ? NO : YES; 

            // Add to list.
            [rssList addObject:article];
            // Release article.
            [article release];
        }
    }
    else NSLog( @\"SortSQLDatabase: Failed from sqlite3_prepare_v2. Error is:  %s\", sqlite3_errmsg(articlesDB) );

    // Finalize and close database.
    sqlite3_finalize(statement);

    NSLog(@\"End\\n\\n\\n\");
}
您如何在此函数中看到我创建了文章
Article* article;
,并在while循环分配中对其进行了初始化。之后,我将Article对象添加到
NSMutableArray
,然后释放它,但随后我调用
[article release];
巫婆必须调用它不调用的delloc函数?我不明白为什么。我尝试了不同的方式,但是所有尝试都崩溃了。这是关于文章类的文章-链接     
已邀请:
未在Article对象上调用dealloc,因为ѭ6保留了article对象。因此您的保留数为1,并且不会被释放。现在,如果释放rssList(或从数组中删除商品对象),则保留计数将变为0,并且该对象将被释放。 附注:如果您有这样的while循环,建议您添加一个自动释放池,以避免自动释放对象的建立。
while( .. )
{
  NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
  // .. your code .. //
  [pool release];
}
P.P.S:如果您按下\'Shift + Cmd + A \',则XCode将静态分析您的代码并查找泄漏/内存事故。我有一种感觉,它将找到一些。     
您有几种选择,您应该尝试看看自己想做什么。基本上,一旦您发送了
[article release];
,就需要从头开始制作
article
。所以你可以做类似的事情
Article *article = [[Article alloc] initWithValues:[NSString stringWithUTF8String:(const char*)sqlite3_column_text(statement, 1)] 
                                         mainLink:[NSString stringWithUTF8String:(const char*)sqlite3_column_text(statement, 0)] 
                                          summary:[NSString stringWithUTF8String:(const char*)sqlite3_column_text(statement, 2)] 
                                          pubDate:[NSString stringWithUTF8String:(const char*)sqlite3_column_text(statement, 3)] 
                                           author:[NSString stringWithUTF8String:(const char*)sqlite3_column_text(statement, 4)] 
                                        imageLink:[NSString stringWithUTF8String:(const char*)sqlite3_column_text(statement, 5)] ];
然后离开
[article release];
不过,请务必从上方取出
Article* article;
行。这可能是您不想要的大量开销。 您可以使所有内容保持不变,然后向下移动
[article release];
,这样它就在循环之外。     

要回复问题请先登录注册