1

リモート通知を受け取るアプリがあります。プッシュ後に表示されるView Controllerにはテーブルビューがあります。回線設定フレームでアプリが非常にランダムに (20 回に 1 回) クラッシュします。

if (!myTableView) {
        NSLog(@"self.myTableView is nil");
    }
    myTableView.frame=CGRectMake(0, 70, 320, 376);

これは、アプリを開いてから他のアプリを開いてプッシュ通知を受け取ったときにのみ発生します。記憶と関係があると思います。私はARC(ios 5)を使用しています。おかしいのは、nslog が表示されないので、tableview が nil ではないことです。

クラッシュログ:

Exception Type:  EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_INVALID_ADDRESS at 0x522d580c
Crashed Thread:  0

 Thread 0 name:  Dispatch queue: com.apple.main-thread
 Thread 0 Crashed:
 0   libobjc.A.dylib                0x352b1f7e objc_msgSend + 22
 1   Foundation                     0x37dc174c NSKVOPendingNotificationCreate + 216
 2   Foundation                     0x37dc1652 NSKeyValuePushPendingNotificationPerThread + 62
 3   Foundation                     0x37db3744 NSKeyValueWillChange + 408
 4   Foundation                     0x37d8a848 -[NSObject(NSKeyValueObserverNotification) willChangeValueForKey:] + 176
 5   Foundation                     0x37e0ca14 _NSSetPointValueAndNotify + 76
 6   UIKit                          0x312af25a -[UIScrollView(Static) _adjustContentOffsetIfNecessary] + 1890
 7   UIKit                          0x312cca54 -[UIScrollView setFrame:] + 548
 8   UIKit                          0x312cc802 -[UITableView setFrame:] + 182
 9   POViO                          0x000913cc -[FeedVC viewWillAppear:] (FeedVC.m:303)

ログに記録されていないため、Dealloc は呼び出されません。

- (void)dealloc {

NSLog(@"dealloc");

}
4

3 に答える 3

0

メモリに問題があります。tableView の保持カウントがゼロに達しています。そのため、tableView へのポインターはまだ存在しますが、システムはその実際のアドレスでオブジェクトを破棄したため、EXC_BAD_ACCESS.

tableView を表示した UI が非表示になっているためにアンロードされている可能性がありますが、テーブル ビューが存在しない場合でも存在すると想定するロジックが残っています。

プロジェクトの詳細を確認せずに、何が起こっているのかをデバッグするのは困難です。最善の方法は、アプリケーションの設計と UI フローを注意深く確認することです。UI が解放される原因は何ですか? UI の一部がまだそこにあると想定するコードをどのように入力していますか?

NB nil 参照にメッセージを送信しても、エラーは発生しません。これは言語設計によるものです。

于 2012-09-07T09:41:22.590 に答える
-1

フレームを直接変更しないで、次のようにします。

CGRect frame = self. myTableView.frame;
frame.x =something;
frame.y=something;
myTableView.frame=frame;

そして私に知らせてください。

于 2012-09-07T09:36:57.277 に答える