0

私は、他の誰かによって設計されたアプリケーションに取り組んでいます。アプリケーションは、次のような呼び出しでいっぱいです。

[NSThread detachNewThreadSelector:@selector(loadPhotoImage) toTarget:self withObject:nil];

DownloadPhotoThread *thread = [[DownloadPhotoThread alloc] initWithFriendArray:_friendsList delegate:self];
[self.arrDownloadThreads addObject:thread];
[thread start];

そしてランダムに、UI全体がロックされ、電話/シミュレーターがタッチに反応しなくなる状況に陥ります。明確にするために、デバイスがフリーズすることはありません。デバッグ セッション中に一時停止すると、スレッドが start または detachNewThreadSelector 行にあることがわかります。

今日、これらのロックが発生する原因を絞り込むことができました。Zendesk フォーム コントローラーを追加しました (ここにあります: https://github.com/zendesk/zendesk_ios_sdk/blob/master/DropboxSampleApp/FormViewController.m ) 。

このコードは次のとおりです。

- (void) textViewDidChange:(UITextView *)textView
{
    [self.tableView beginUpdates];
    [self.tableView endUpdates];
}
- (CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (indexPath.row > 1) {
        CGSize s = [description sizeThatFits:CGSizeMake(description.frame.size.width, 10000)];
        float dh = MAX(s.height, 115);
        description.frame = CGRectMake(description.frame.origin.x, 
                                   description.frame.origin.y, 
                                   description.frame.size.width, 
                                   dh);
        return dh;
    }
    return 44.0;
}

文字を入力してこのテキスト ボックスに何度も戻ることで、ロックアップ状態を簡単に再現できます。(これにより、テーブル ビューの高さが変更されます)

場合によっては、犯罪者を次のように dispatch_async() ブロックでラップすることで、ロックアップ状態を防ぐことができます。

DownloadPhotoThread *thread = [[DownloadPhotoThread alloc] initWithFriendArray:_friendsList delegate:self];
[self.arrDownloadThreads addObject:thread];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    [thread start];
});

しかし、問題のあるコードが ASIHTTPRequest や XMPPFramework などの複雑なライブラリにあるため、それ以外の場合はできません。ここで何が起こっているのかについて何かアドバイスはありますか?

別物。この状態で一時停止すると、メイン スレッドは次のように表示します。

Thread 1
com.apple.main-thread
0 objc_msgSend
....
25 UIApplicationMain
26 main

一時停止と一時停止解除では、objc_msgSend 内のアセンブリ命令で常にメインが検出されます。

私はここで真剣に困惑しているので、助けてくれてありがとう。

4

1 に答える 1