7

GAとユーザーからこのクラッシュレポートを受け取り続けています...しかし、ios7とios8の両方でiphone5、5s、6をテストしても、この例外を再現できません。アプリケーションがバックグラウンドに入ると、この問題はどこにも起こりません。奇妙な部分は、gamecenter がアチーブメント バナーを表示するために spritekit を呼び出すことです。

誰かが同じ問題を抱えていますか?

Last Exception Backtrace:
0   CoreFoundation                  0x23c99e3f __exceptionPreprocess + 127
1   libobjc.A.dylib                 0x31371c8b objc_exception_throw + 38
2   CoreFoundation                  0x23c9f189 -[NSObject(NSObject) doesNotRecognizeSelector:] + 188
3   CoreFoundation                  0x23c9d0a7 ___forwarding___ + 714
4   CoreFoundation                  0x23bcf208 _CF_forwarding_prep_0 + 24
5   SpriteKit                       0x26fe9689 -[SKNode isEqual:] + 164
6   Foundation                      0x248ec9ff +[NSObject(NSDelayedPerforming) cancelPreviousPerformRequestsWithTarget:] + 358
7   GameCenterFoundation            0x2a945873 -[GKPlayer postChangeNotification] + 38
8   GameCenterFoundation            0x2a958d21 __52-[GKDaemonProxy setLocalPlayer:authenticated:reply:]_block_invoke + 848
9   libdispatch.dylib               0x318d18cb _dispatch_call_block_and_release + 10
10  libdispatch.dylib               0x318d18b7 _dispatch_client_callout + 22
11  libdispatch.dylib               0x318d50bf _dispatch_main_queue_callback_4CF + 722
12  CoreFoundation                  0x23c5fbe9 __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 8
13  CoreFoundation                  0x23c5e2e9 __CFRunLoopRun + 1512
14  CoreFoundation                  0x23bac621 CFRunLoopRunSpecific + 476
15  CoreFoundation                  0x23bac433 CFRunLoopRunInMode + 106
16  GraphicsServices                0x2af1b0a9 GSEventRunModal + 136
17  UIKit                           0x27197359 UIApplicationMain + 1440
18  MyAppName                       0x001b4f27 main (main.m:16)
19  libdyld.dylib                   0x318f1aaf start + 2

iOS8での同様のクラッシュの問題GKLocalPlayerInternal 認識されないセレクター

SKNodeとGKPlayerを使ってテストしてみた

SKNode* node = [SKNode node];
GKPlayer* player = [GKLocalPlayer localPlayer];
[node isEqual:player];

上記の結果と同じように、次の例外が発生します。これは、システムが SKNode を [GKPlayer postChangeNotification] と比較することを意味します....それは本当に奇妙です。

-[GKLocalPlayerInternal name]: unrecognized selector sent to instance 0x1b6e3f80
4

3 に答える 3

6

SKNode isEqual で同様のコールスタックがありました。これは、IOS 8.1 でのみ発生します。一定のクラッシュがありましたが、別のシナリオで... -[GADSlot name]: 認識されないセレクターがインスタンスに送信されました

このメソッドが呼び出されると、すべてがトリガーされると思います。+[NSObject(NSDelayedPerforming) cancelPreviousPerformRequestsWithTarget:]

これが [SKNode isEqual] を呼び出す理由を説明することはできません (おそらくキャンセルするものがいくつかあります) が、私にとってはクラッシュが発生します。この問題についてさらに調査したところ、SKScene isEqual を呼び出していたことが判明しました。SKScene isEqual: メソッドが正しく実装されていません (Apple にバグとして報告しました)。また、SKSpriteNode には、私が試していない残りの SKNode についても同じ問題がありますが、おそらく同じ問題があります。

私の場合、この修正をサブクラス化された SKScene オブジェクトに追加しました。確かに、すべての SKNode isEqual をグローバルに修正するわけではありませんが、私の問題は解決しました。

   - (BOOL)isEqual:(id)other {

        if (![other isMemberOfClass:[SKScene class]]) {
            return false;
        }
        return [super isEqual:other];
    } 
于 2014-12-27T14:57:40.610 に答える
2

あなたが言うように、SKNode を任意の GKLocalPlayer と比較するだけでクラッシュを再現できる場合、これは SpriteKit のバグであると思われます。これは、任意のオブジェクトに対して等価チェックを実行してもクラッシュしないためです。

スタミナがあれば、アプリ内のすべての SKNode をサブクラス化し、メソッドisEqualhashメソッドを自分で実装できます。これにより、そのセレクターを実装していないオブジェクトでの名前比較チェックの誤りを回避できます。

また、これをバグとして Apple に報告することをお勧めします。

この質問は、Apple が iOS8 で SKNode の等価性とハッシュ メソッドを実際に更新したことを示しているように思われるため、その変更によってバグが発生した可能性があります。

于 2014-11-01T08:22:06.163 に答える
0

Swift のサブクラス:

import SpriteKit

class Scene: SKScene {

    override func isEqual(object: AnyObject?) -> Bool {
        if object?.isKindOfClass(SKScene) == false {
            return false
        }

        return super.isEqual(object)
    }
}

申し込み:

class YourScene: Scene {
    // your code
}
于 2016-03-25T13:06:04.947 に答える