1

ここで言っていたように、UPDATEステートメントに問題がありました:sqliteManagerの更新の問題

initWithFormatが機能することがわかりました

NSString *sqlStr = [[NSString alloc] initWithFormat:@"UPDATE User SET Name = :Name WHERE Id = :Id"];

しかし、stringWithFormatではありません:

 NSString* sqlStr = [NSString stringWithFormat:@"UPDATE User SET Name = :Name WHERE Id = :Id"];

なぜそうなのですか?背後にある論理/理由を理解したいと思います。

4

2 に答える 2

2

文字列のメモリ管理に関係しているのではないかと思いますが、十分に保持されていない可能性があるため、使用する前にクリーンアップしています。2つの方法の違いはここで定義されます

于 2012-07-18T18:05:55.557 に答える
0

このスレッドから何か面白いものを見つけました:NSTimerループ中にTableViewセルデータを更新する方法

これが背後にある理由だと私は信じています。

「petergb」が言ったことを引用します:

[NSString stringWithFormat:...]は自動解放されたオブジェクトを返します。自動解放されたオブジェクトは、制御がプログラムのコードからアップル提供の実行ループコードに戻った後に解放されます。それらは多かれ少なかれ便利なので、あちこちで1、2回使用するすべての小さなオブジェクトを解放する必要はありません。(たとえば、@ ""構文で作成したすべての文字列を解放する必要があるとしたら、どれほど面倒なことになるか想像してみてください...)

stringWithFormat :は自動解放されたオブジェクトを返します。これは、慣例により、名前がallocまたはcopyで始まらないメソッドは、常に自動解放されたオブジェクトを返すためです。このようなメソッドは、オブジェクトを「提供」すると言われています。これらのオブジェクトは近い将来使用できますが、「所有」することはありません(つまり、システムに制御を戻した後、オブジェクトが存在することを期待できません)。販売されたオブジェクトの所有権を取得する場合は、その上で[objectretain]を呼び出す必要があります。その後、[objectrelease]または[objectautorelease]を明示的に呼び出すまでそこにあります。また、参照を失う前にreleaseまたはautoreleaseを呼び出さない場合は、そこにあります。変数を別のものに変更することで、それをリークします。

[[NSString alloc] initWithFormat:と対比してください。このメソッドは、オブジェクトを「作成」します。私たちはそれを所持している。ここでも、[オブジェクトの解放]を明示的に呼び出すまでそこにあります。

于 2012-07-19T08:22:37.437 に答える