2012-02-19 5 views
0

私はsqliteデータベースからいくつかの情報を読み込み、Achievementというクラスを初期化するメソッドを持っています。私がこのコードを分析すると、フィードバックが返されました。私はどこに間違っているのか本当に理解していません。なぜretvalオブジェクトが225行目にリリースされ、229行目のreturn文には公開されていませんか?iOS - オブジェクトがautoreleaseを何度も送信しました

私は以下のコードでどこで間違いを犯したのか、どうすれば修正できるのか説明していただけますか?

ファンクションコード(SO回答を容易にコピーすることができ/ペースト):

- (Achievement *)getAchievement:(int)Id 

{

Achievement *retval = [[Achievement alloc] autorelease]; 

NSString *query = [NSString stringWithFormat:@"SELECT * FROM Achievements where ID = %d", Id]; 

sqlite3_stmt *statement; 

if (sqlite3_prepare_v2(_database, [query UTF8String], -1, &statement, nil) 
    == SQLITE_OK) { 
    while (sqlite3_step(statement) == SQLITE_ROW) { 
     int Id = sqlite3_column_int(statement, 0); 
     char *name = (char *) sqlite3_column_text(statement, 1); 
     char *title = (char *) sqlite3_column_text(statement, 2); 
     char *description = (char *) sqlite3_column_text(statement, 3); 

     Boolean Achieved; 
     char *com = (char *) sqlite3_column_text(statement, 4); 
     NSString *c1 = [[[NSString alloc] initWithUTF8String:com] autorelease]; 
     Achieved = [c1 isEqualToString:@"1"]; 

     NSDate *CompletedDate = (NSDate *) sqlite3_column_text(statement, 5); 

     char *icon = (char *) sqlite3_column_text(statement, 6); 

     int New = sqlite3_column_int(statement, 7); 

     NSString *Title = [[[NSString alloc] initWithUTF8String:title] autorelease]; 
     NSString *Description = [[[NSString alloc] initWithUTF8String:description] autorelease]; 
     NSString *Name = [[[NSString alloc] initWithUTF8String:name] autorelease]; 
     NSString *Icon = [[[NSString alloc] initWithUTF8String:icon] autorelease]; 

     retval = [retval initDetails:Id :Name :Title: Description : Achieved : CompletedDate: Icon: New]; 
    } 
    sqlite3_finalize(statement); 
} 
return retval; 

}

分析フィードバック画像:いつものように enter image description here

任意フィードバック大変感謝しています。

答えて

2
Achievement *retval = [[Achievement alloc] autorelease]; 

これは非常に悪い考えです。常にオブジェクトを初期化してから使用する必要があります。 は、代わりに、ループの中でそれを初期化している:

retval = [retval initDetails:Id :Name :Title: Description : Achieved : CompletedDate: Icon: New]; 

あなたが同じオブジェクトを複数回初期化する必要があり、なぜ私は本当に得ることはありません。たぶん、あなたは複数のオブジェクトを作成し、それらを異なる値で初期化する必要がありますか?私はあなたがallocinitautoreleaseの間違った順序でコンパイラを混乱していると思います

Achievement *retval = nil; 
while (...) { 
    [retval release]; 
    retval = [[Achievement alloc] initDetails: ...]; 
} 
return [retval autorelease]; 
+0

ありがとうございましたMaxは、一度だけ繰り返し処理されます(SQLでは1行しか返されません)。 dbコールから返された値がそこで利用できるので、私はループでそれを初期化します。どのように私は機能を並べ替えることをお勧めしますか? – MattStacey

1

はこれを並べ替えます。代わりに、次のコードを実行する必要があります。

Achievement *retval = nil; 
while (...) { 
    retval = [[[Achievement alloc] initDetails: ...] autorelease]; 
} 
return retval; 
+0

ああ、ペニードロップの瞬間。ありがとう。 – MattStacey

関連する問題