Domanda

Non ho funzione denominata: - (void) AddSortedCustomFeed :(NSMutableArray*) rssList; questa funzione aggiunge articoli (articoli) dal database SQLite per NSMutableArray qui come funziona la funzione:

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

Come si può vedere in questa funzione creo articolo Article* article; e nel ciclo while alloc e inizializzarla. Dopo di che aggiungo l'articolo oggetto da NSMutableArray e poi rilasciarlo, ma poi ho chiamata [article release]; strega deve chiamare delloc funzione non chiama? Non riesco a capire il perché. Provo modi diversi, ma tutti i miei tries crash. Questo è l'articolo su Articolo Classe - link

È stato utile?

Soluzione

dealloc non è chiamato sull'articolo oggetto perché [rssList addObject:article] mantiene l'oggetto articolo. Quindi il valore del tuo trattenere è 1, e non sarà rilasciato. Ora, se si rilascia rssList (o rimuovere l'oggetto articolo dalla matrice), il conteggio conservare colpirà 0, e l'oggetto verrà rilasciato.

P.S:. Se si ha un ciclo while come questo vi consiglio di aggiungere una piscina autorelease per evitare gli oggetti autorelease accumulano

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

PPS: se si ha colpito 'Shift + Cmd + A' XCode sarà analizzare staticamente il codice e look per contrattempi perdite / memoria. Ho la sensazione che sarà trovare un po '.

Altri suggerimenti

Avete alcune scelte, si dovrebbe sperimentare per vedere che cosa si vuole fare. In sostanza, una volta che avete inviato [article release]; dovrai ricominciare da capo per fare il article. Così si potrebbe fare qualcosa di simile

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

e congedo [article release]; dove è ora. Essere sicuri di prendere la vostra linea di Article* article; dall'alto però. Questo è probabilmente un sacco di spese generali che non si desidera.

Si potrebbe tenere tutto lo stesso e spostare [article release]; verso il basso in modo che sia al di fuori del ciclo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top