2
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellId];
if (cell == nil) 
    {
    [[NSBundle mainBundle] loadNibNamed:@"ThemeCell" owner:self options:nil];
        cell = self.themeCell;
        self.themeCell = nil;
}
...
return cell;

私の理解ではself.themeCell = nil;、オブジェクトの所有者はもういないので、オブジェクトを破棄する必要があります。cell = self.themeCell保持しませんが、割り当てるだけです。では、何が細胞を生かし続けるのでしょうか?合成されたプロパティが古い値をすぐに解放するのではなく、自動解放していると推測することしかできません。これは本当ですか?

4

2 に答える 2

2

ペン先の読み込みプロセスは少し(それほどではありませんが)複雑で、OSXプラットフォームとiPhoneプラットフォームで異なります。これについては、リソースプログラミングガイドの「Nibオブジェクトのライフサイクル」セクションで読むことができます。表1-1に、次の情報があります。

nibファイル内のオブジェクトは、保持カウント1で作成されてから、自動解放されます。ただし、UIKitはオブジェクト階層を再構築するときに、setValue:forKey:メソッドを使用してオブジェクト間の接続を再確立します。このメソッドは、使用可能なsetterメソッドを使用するか、setterメソッドが使用できない場合はデフォルトでオブジェクトを保持します。

つまり、セルは保持カウント1で作成され、合成セッターで設定すると2に増加します。プロパティをnil保持カウントに設定すると、セルは1に減少します。テーブルビューに戻ります。テーブルビューはそれをビュー階層に追加し、それによってそれを保持します(そして、おそらくそのロジックの他の部分にも保持します)。このすべての後、autoreleaseプールは排水されます。

統合されたプロパティがリリースではなく古い値を自動リリースしていると想定することしかできませんが、これは本当ですか?

いいえ、合成されたセッターはオブジェクトをすぐに解放します。(一部のフレームワーククラスは、オブジェクトを少し長く保持する場合がありますが、たとえば、アニメーション化する必要があるビューの場合)。

于 2010-07-31T14:20:20.823 に答える
0

AFAIK、合成されたプロパティはrelease、ではなくを使用しますautorelease

セルに所有権を保持しているNIBで指定されたデリゲートなどがあるか、loadNibNamed:owner:options:呼び出し内の何かがまだ保留中のオブジェクトに自動解放を設定している可能性があります。NSLog(@"Retain Count: %d", [cell retainCount]);の前後に置いself.themeCell=nil;て確認します。

于 2010-07-31T14:19:52.723 に答える