4

序章

現在のアプリケーションには、カスタム セル オブジェクトを保持する UITableView があります。カスタム UIViewCellObjects は、標準の UITableViewCell クラスから単純にサブクラス化されています。カスタム セルには、実行中のバックグラウンド アップロードに関する情報が保持され、完了率などで更新されます。

カスタム セル オブジェクトは、バックグラウンドで実行されているアップロード プロセスからの NSNotifications をリッスンし、関連する通知を受け取ると、独自のビュー コントロールを新しい情報 (アップロードの割合など) で更新するだけです。

アップロード プロセスが完了したら、アクティブなアップロード オブジェクトの配列を並べ替えて、次のようにテーブルビューをリロードします。

-(void) uploadFinished: (NSNotification*)notification
{
    NSDictionary *userInfo = [notification userInfo];

NSNumber *uploadID = [userInfo valueForKey:@"uploadID"];

if (uploadID.integerValue == uploadActivity.uploadID)
{   
    [[ApplicationActivities getSharedActivities] markUploadAsFinished:uploadActivity];
    [parentTable reloadData];

    [self setUploadComplete];
}
}

このメソッドは tableviewcell オブジェクトで実行され、ご覧のとおり、配列がソートされた直後に独自の UITableView を呼び出してデータをリロードします。markUploadAsFinishedメソッドは単に配列を並べ替えて、新しく完了したアップロードが一番上に来るようにするだけなので、UITableView ではこのように表示されます。

問題

今私が抱えている問題は、このメソッドが呼び出されると、次のエラーが発生する ことがあることです:

プロセス全体が正常に実行され、完了したアップロードが UItableview の最初に表示されることもあれば、一見ランダムに失敗することもあります。ここで何が起こっているのか、私にはまったくわかりません。

カスタム セルは、次のように .NIB ファイルから読み込まれます。

    UploadCell *cell = [activeUploadsTable dequeueReusableCellWithIdentifier:@"UploadProgressCell"];

if (cell == nil)
{
    [[NSBundle mainBundle] loadNibNamed:@"UploadCellView" owner:self options:nil];

    cell = customCell;
}

ここで何が起こっているかについて手がかりを持っている人はいますか?

編集

まず、このエラーを追跡して、次の行に表示されるようにしました。

カスタム セル オブジェクト内で呼び出されます。

さらに、メソッドを送信するインスタンスが変更される可能性があるようです。私もこのエラーを受け取りました:

'NSInvalidArgumentException', reason: '-[UIScrollViewPanGestureRecognizer tableView:numberOfRowsInSection:]: unrecognized selector sent to instance

ここで何が起こっているのか本当にわかりません。

4

2 に答える 2

6

'-[CALayer tableView:numberOfRowsInSection:]: 認識されないセレクターがインスタンスに送信されました

あなたは悪いポインタを持っています。テーブルがまだ存在している間に、テーブルのデータ ソースが解放されているようです。保持サイクルが発生する可能性があるため、テーブルはデータ ソースを保持しません。テーブルがデータ ソースを使用している間、データ ソースを保持しないように注意しないと、テーブルが存在しなくなったオブジェクトへのポインターを保持する可能性があります。この場合、その後同じアドレスに CALayer オブジェクトが作成されているように見えます。後でテーブルが「データ ソース」にメッセージを送信して行数を取得すると、そのメッセージは (明らかに) メソッドを持たないレイヤーに配信され-tableView:numberOfRowsInSection:、エラーが発生します。

于 2012-02-18T06:32:14.490 に答える
0

バックグラウンドでアップロードプロセスメソッドを実行している私によると、メインスレッド以外のスレッドだと思います。私の知る限り、UIKIT オブジェクトを扱うときは、メイン スレッドで台無しになります。

しかし、これらの問題は毎回発生するわけではありません。これは、他のスレッドからメインスレッドに切り替えることがあるため、正常に動作する場合とそうでない場合があるためです。問題が発生するように

于 2012-02-18T04:35:18.067 に答える