私は非常に単純なマルチプレイヤー アプリを作成しました。これは、対戦相手を 1 人だけ見つけて 5 秒で終了させるだけです。
-(void)matchmakerViewController:(GKMatchmakerViewController *)viewController
didFindMatch:(GKMatch *)match {
[self.presentingViewController dismissModalViewControllerAnimated:YES];
self.match = match;
self.match.delegate = self;
if (!self.matchStarted && self.match.expectedPlayerCount == 0)
{
NSLog(@"Ready to start match!");
//[self lookupPlayers];
// My Own Test Code Begin
if (!self.delegate) NSLog(@"No delegate on match invite.");
// Notify delegate match can begin
self.matchStarted = YES;
[self.delegate matchStarted];
// My Own Test Code End
}
}
AppDelegate のいくつかのメソッド:
-(void)matchStarted
{
CCLOG(@"Match started. Delay 5 seconds...");
[self performSelector:@selector(matchEnded) withObject:nil afterDelay:5];
}
-(void)matchEnded
{
CCLOG(@"Match ended");
[[GameCenterMatchHelper sharedInstance].match disconnect];
[GameCenterMatchHelper sharedInstance].match = nil;
}
最初の試合ではすべて正常に動作します。しかし、試合が終了すると、3 つのスレッドが追加されます (実行を一時停止していることがわかります)。
- スレッド com.apple.gamekitservices.gcksession.recvproc
- スレッド com.apple.gamekitservices.gcksession.sendproc
- スレッド com.apple.gamekitservices.eventcallback.eventcbproc
そして、2 つのマッチを開始すると、マッチ終了後にすでに 6 (3 と 3) のスレッドが存在します。そして、それがとても悪い主な理由 - アプリがクラッシュし、すべてのプレイヤーが切断されているようです.
最新の iOS 6 でのテストには、iPod touch 4g と iPad 2 を使用します。これらのスレッドは両方のデバイスで作成されます。
GCHelper とすべてのデリゲートにシングルトン クラスを使用しているためだと思いましたが、追加のスレッドが表示されるたびに、一度だけ使用する他のクラスにデリゲートを抽出しようとしました。
多分smbはどうすれば修正できるか知っていますか?