2

UIAlertViewメイン スレッドに が表示されるという問題があります。理由はわかりませんが、メインスレッドで実行しているにもかかわらず、クラッシュし続けます。次のブロックはバックグラウンド スレッドにありますが、以下のようにメインにアラートがあります。

void (^removeFromCalendar)(NSString *, NSString *, EKEventStore *) = ^(NSString *error, NSString *eventKey, EKEventStore *eventDB) {
    EKEvent *myEvent = [eventDB eventWithIdentifier:eventKey];
    NSError *err = noErr;

    if(myEvent != NULL && myEvent != (id)[NSNull null]) {
        [eventDB removeEvent:myEvent span:EKSpanThisEvent error:&err];
    } else {

        // Event was not found, nothing to do
        return;
    }

    [eventDB release];

    if (!err || err == noErr) {
        NSLog(@"Deleted event %@", myEvent.title);

        // Show alert on the main thread
        dispatch_async(dispatch_get_main_queue(), ^{
            // Showing the alert for unattending
            NSString *resultString = @"This event was removed from your calendar.";
            UIAlertView *alert = [[[UIAlertView alloc] initWithTitle:@"Info" message:resultString delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil] autorelease];
            [alert show];
        });

        return;
    }

    error = err.description;
};

アラートが表示されている下部をコメントアウトすると、すべて問題ありません。しかし、アラートについては、EXC_BAD_ACCESSエラーが発生し続けます。誰かが理由を説明できますか?それは正しいスレッドにあり、メモリの問題がどこから発生する可能性があるかを一生理解できません!

4

3 に答える 3

1

バックグラウンドキューを終了するまで、終了時にビューが解放されている可能性があります。したがって、安全のために、このように使用しないでください。

...........
  UIViewController __weak *myController = self;
 dispathch_async(backgroundQueue, ^{ 
   UIViewController __strong *myStrongController = myController;
 ...............
 dispatch_async(dispatch_get_main_queue(), ^{
            if(myStrongController){
            // Showing the alert for unattending
            NSString *resultString = @"This event was removed from your calendar.";
            UIAlertView *alert = [[[UIAlertView alloc] initWithTitle:@"Info" message:resultString delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil] autorelease];
            [alert show];
            }
        });
}).
于 2012-11-23T20:50:05.117 に答える
0

dispatch_async を使用する代わりに、目的の C 呼び出しを使用してみませんか。

[self performSelectorOnMainThread

独自の方法でパッケージ化する必要がある場合があります。または、次を使用して呼び出します。

[self performSelector:@selector(myAlertMethod) withObject:nil afterDelay:0.25]

これらの方法は、初日から試行され、真です。

于 2012-11-24T04:21:10.610 に答える