0

最近、この動作が 2 回発生しましたが、問題の根本的な原因が何であるか疑問に思っていました (つまり、これが発生しないようにするにはどうすればよいので、修正に多くの時間を無駄にする必要はありません)。

再利用する予定のテーブルビュー セル内に何かを割り当てると、別のセルが読み込まれてテーブルがリロードされると、そのオブジェクトが割り当て解除されることがあります。

例:

SubHolder *dataStorage;

- (void) initializeLicenseTable
    {
        LicenseCell *sampleLicense = [LicenseCell new];
        self.licenseData = [[NSMutableArray alloc] initWithObjects:sampleLicense, nil];
        nib = [UINib nibWithNibName:@"LicenseCell" bundle:nil];

    if (dataStorage == nil)
    {
        dataStorage = [SubHolder new];
        dataStorage.owner = self;
        [dataStorage addStorageLocation];
    }
} //cellForRowAtIndexPath and stuff

このコードは、if ステートメントがないと機能しません (dataStorage がゾンビになります)。

この動作の原因は何ですか? dataStorage が nil かどうかをテストしてから、それを割り当てることは、ゾンビの問題を修正することとは正反対のようです。

-編集-

この動作が変数の共有によって引き起こされる場合、このオブジェクトのインスタンスが作成されるたびに独自のデータ ストレージ オブジェクトが作成されるようにするにはどうすればよいでしょうか? 各テーブルには独自の情報があり、他のテーブルとは共有されません。

4

2 に答える 2

2

はグローバル変数(クラスのファイルスコープに表示されます)であるためdataStorage、クラスのすべてのインスタンスで共有されます。

ここで、クラスの2番目のインスタンスが初期化され、チェックしない場合

if (dataStorage == nil)

次に、グローバルオブジェクトが上書きされるため、ある時点でARCを介して割り当てが解除されます。他のオブジェクトがその値をどこかに保存していた場合、そのオブジェクトは古いオブジェクトにアクセスしようとし、ゾンビアクセスを取得します。

編集:

各オブジェクトに独自のがdataStorage必要な場合は、単に宣言する必要があります

SubHolder *dataStorage;

interface宣言内、または次のようなプロパティ:

@property (nonatomic, strong) SubHolder *dataStorage;
于 2012-06-28T19:16:18.130 に答える
1

再利用するのではなく、常に新しいセルを作成しているようです。

次のようにセルを再利用する必要があります。

UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:@"myCell"];
if(cell == nil) 
{
    cell = [[UITableViewCell alloc] initWithStyle:aStyle reuseIdentifier:@"myCell"];
}
于 2012-06-28T19:05:53.800 に答える