Frage

Ich habe die Funktion namens: - (void) AddSortedCustomFeed :(NSMutableArray*) rssList; Diese Funktion fügt Elemente (Artikel) aus der SQLite -Datenbank zu Fühe hinzu NSMutableArray Hier funktioniert diese Funktion:

- (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");
}

Wie Sie in dieser Funktion sehen können, erstelle ich Artikel Article* article; und in während des Schleifens zuordnen und initialisieren. Danach füge ich ein Artikelobjekt hinzu zu NSMutableArray Und dann loslassen, aber dann rufe ich an [article release]; Hexe muss die Delloc -Funktion aufrufen, die nicht aufgerufen wird? Ich kann nicht verstehen warum. Ich versuche verschiedene Arten, aber alle meine Versuche stürzen ab. Dies ist Artikel über Artikelklasse - Verknüpfung

War es hilfreich?

Lösung

OVALLOC wird das Artikelobjekt nicht angerufen, weil [rssList addObject:article] behält das Artikelobjekt. Ihre Halterzahl ist also 1 und wird nicht veröffentlicht. Wenn Sie nun RSSLIST veröffentlichen (oder das Artikelobjekt aus dem Array entfernen), wird die Zahlung von 0 auf 0 getroffen und das Objekt wird freigegeben.

PS: Wenn Sie eine Weile wie diese haben, empfehle ich Ihnen, einen Autorelease -Pool hinzuzufügen, um zu vermeiden, dass Autorelease -Objekte aufgebaut sind.

while( .. )
{
  NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
  // .. your code .. //
  [pool release];
}

PPS: Wenn Sie 'Shift+CMD+A' Xcode klicken statisch analysieren Ihr Code und suchen Sie nach Lecks/Speicherpannen. Ich habe das Gefühl, dass es einige finden wird.

Andere Tipps

Sie haben ein paar Möglichkeiten, Sie sollten experimentieren, um zu sehen, was Sie tun möchten. Grundsätzlich, sobald Sie gesendet haben [article release]; Sie müssen von Anfang an beginnen, um das zu machen article. Sie könnten also so etwas tun wie

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)] ];

und gehen [article release]; wo es jetzt ist. Stellen Sie sicher, dass Sie Ihre Linie von herausnehmen Article* article; Von oben jedoch. Dies ist wahrscheinlich viel Overhead, den Sie nicht wollen.

Sie könnten alles gleich halten und sich bewegen [article release]; Runter, das ist es außerhalb der Schleife.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top