Frage

Vor kurzem habe ich es Berichte von meiner app intermittierender Fehler bekommen „Unbekannter Selektor“ in Bereichen behaupten, die bewirken, dass sie nicht nur konnte, und doch sie tun.

Zum Beispiel dieses:

Error: NSInvalidArgumentException: *** -[NSCFString didReceiveMemoryWarning]: unrecognized selector sent to instance 0x541fe0
0  CoreFoundation                      0x32de1e23 __handleUncaughtException + 230
1  libobjc.A.dylib                    0x3266d894 _objc_terminate + 156
2  libstdc++.6.dylib                  0x338c3a8c _ZN10__cxxabiv111__terminateEPFvvE + 84
3  libstdc++.6.dylib                  0x338c3b04 _ZSt9terminatev + 24
4  libstdc++.6.dylib                  0x338c3c2c __cxa_throw + 108
5  libobjc.A.dylib                    0x3266be5c objc_exception_throw + 112
6  CoreFoundation                      0x32de2bfd -[NSObject doesNotRecognizeSelector:] + 112
7  CoreFoundation                      0x32d67b19 ___forwarding___ + 480
8  CoreFoundation                      0x32d5e840 _CF_forwarding_prep_0 + 48
9  Foundation                          0x33f765d9 _nsnote_callback + 184
10  CoreFoundation                      0x32d9e511 _CFXNotificationPostNotification + 304
11  Foundation                          0x33f741b3 -[NSNotificationCenter postNotificationName:object:userInfo:] + 70
12  Foundation                          0x33f76519 -[NSNotificationCenter postNotificationName:object:] + 20
13  UIKit                              0x30d18db8 -[UIApplication _performMemoryWarning] + 68
14  UIKit                              0x30d18d50 -[UIApplication _receivedMemoryNotification] + 136
15  UIKit                              0x30d18c80 _memoryStatusChanged + 64
16  CoreFoundation                      0x32d66eb7 __CFNotificationCenterDarwinCallBack + 26
17  CoreFoundation                      0x32d5cb51 __CFMachPortPerform + 78
18  CoreFoundation                      0x32da452b CFRunLoopRunSpecific + 2302
19  CoreFoundation                      0x32da3c1f CFRunLoopRunInMode + 50
20  GraphicsServices                    0x31bb9374 GSEventRunModal + 196
21  UIKit                              0x30bf3c30 -[UIApplication _run] + 560
22  UIKit                              0x30bf2230 UIApplicationMain + 968
23  Mind                                0x00002c68 main + 72
24  Mind                                0x00002be4 start + 52

Dies ist das Betriebssystem einen Speicher Warnung an meine app zu senden, und irgendwie die Anwendungsklasse hat sich in eine Zeichenfolge geändert.

Es scheint viel mehr geschehen, wenn der Code über eine NSOperation aufgerufen wird:

Error: NSInvalidArgumentException: -[NSCFString setObject:forKey:]: unrecognized selector sent to instance 0x3e793088
9  Mind                                0x0015de70 -[CCTextureCache textureFromFile:] + 528
10  Mind                                0x0015d9f4 -[CCTextureCache loadImageUncached:pixelFormat:] + 116
11  Mind                                0x0015d058 -[CCTextureCache addImage:pixelFormat:] + 152
12  Mind                                0x00080524 -[ImageLoader imageWithFile:pixelFormat:] + 84
13  Mind                                0x000854c4 -[ImageLoadOperation performLoad] + 68
14  Mind                                0x00085800 -[ResourceLoadOperation main] + 112
15  Foundation                          0x30c4c8b5 -[__NSOperationInternal start] + 664
16  Foundation                          0x30c4c613 -[NSOperation start] + 22
17  Foundation                          0x30cbdb63 ____startOperations_block_invoke_2 + 46
18  libSystem.B.dylib                  0x31227858 _dispatch_call_block_and_release + 20
19  libSystem.B.dylib                  0x3122863c _dispatch_worker_thread2 + 128
20  libSystem.B.dylib                  0x311b1544 _pthread_wqthread + 400
21  libSystem.B.dylib                  0x311a8b74 __stack_chk_fail + 4294967295

Der Code in Frage lautet:

[Texturen setObject: Textur forKey: Dateiname];

Texturen sind NSMutableDictionary Typ * und nie neu zugewiesen wird oder freigegeben (natürlich, da dies ein Cache-Objekt ist). Dies ist der einzige Ort, an dem setObject wird in dieser Methode aufgerufen, noch nach dem Stack-Trace, Texturen wurden ein String.

Ich habe auch diese Seltsamkeit:

Error: NSInvalidArgumentException: -[NSConcreteNotification getPixelFormatForIdentifier:]: unrecognized selector sent to instance 0x5c021b0
9  Mind                                0x0015dd0c -[CCTextureCache textureFromFile:] + 172
10  Mind                                0x0015d9f4 -[CCTextureCache loadImageUncached:pixelFormat:] + 116
11  Mind                                0x0015d058 -[CCTextureCache addImage:pixelFormat:] + 152
12  Mind                                0x00080524 -[ImageLoader imageWithFile:pixelFormat:] + 84
13  Mind                                0x000854c4 -[ImageLoadOperation performLoad] + 68
14  Mind                                0x00085800 -[ResourceLoadOperation main] + 112
15  Foundation                          0x347b78b5 -[__NSOperationInternal start] + 664
16  Foundation                          0x347b7613 -[NSOperation start] + 22
17  Foundation                          0x34828b63 ____startOperations_block_invoke_2 + 46
18  libSystem.B.dylib                  0x32a2f858 _dispatch_call_block_and_release + 20
19  libSystem.B.dylib                  0x32a3063c _dispatch_worker_thread2 + 128
20  libSystem.B.dylib                  0x329b9544 _pthread_wqthread + 400
21  libSystem.B.dylib                  0x329b0b74 __stack_chk_fail + 4294967295

Diese Spur ist aus dem folgenden Code in CCTextureCache:

CCTexture2DPixelFormat Pixelformat = [self getPixelFormatForIdentifier: identifier];

Wie CCTextureCache in NSConcreteNotification geändert, nachdem bereits eine Reihe von Methoden, die auf sich selbst genannt hat, ist rätselhaft, gelinde gesagt.

Hat jemand so etwas bemerkt? Bin ich irgendwie Speicher Korruption zu bekommen?

War es hilfreich?

Lösung

Haben Sie einige Rennbedingungen über Multi-Threads überprüfen? Es scheint wie eine Ressource von einem anderen Thread befreit und aktuelle Thread ein zu einem Objekt ausgeplanten messaged senden.

Error: NSInvalidArgumentException: -[NSCFString setObject:forKey:]: unrecognized selector sent to instance 0x3e793088
9  Mind                                0x0015de70 -[CCTextureCache textureFromFile:] + 528
10  Mind                                0x0015d9f4 -[CCTextureCache loadImageUncached:pixelFormat:] + 116
11  Mind                                0x0015d058 -[CCTextureCache addImage:pixelFormat:] + 152
12  Mind                                0x00080524 -[ImageLoader imageWithFile:pixelFormat:] + 84
13  Mind                                0x000854c4 -[ImageLoadOperation performLoad] + 68
14  Mind                                0x00085800 -[ResourceLoadOperation main] + 112
15  Foundation                          0x30c4c8b5 -[__NSOperationInternal start] + 664
16  Foundation                          0x30c4c613 -[NSOperation start] + 22
17  Foundation                          0x30cbdb63 ____startOperations_block_invoke_2 + 46
18  libSystem.B.dylib                  0x31227858 _dispatch_call_block_and_release + 20
19  libSystem.B.dylib                  0x3122863c _dispatch_worker_thread2 + 128
20  libSystem.B.dylib                  0x311b1544 _pthread_wqthread + 400
21  libSystem.B.dylib                  0x311a8b74 __stack_chk_fail + 4294967295

Andere Tipps

Dies wird oft durch die Speichermanagementfehler verursacht. Haben Sie versucht, Zombies ?

... mit Zombies aktiviert ist, Nachrichten an ausgeplanten Objekte werden nicht mehr verhalten seltsam oder Absturz in schwer zu verstehende Weise, sondern stattdessen eine Nachricht log und stirbt in einer vorhersagbaren und Debugger-breakpointable Art und Weise. Dies ist das Werkzeug zu benutzen, bei dem Versuch, über Mitteilungen und vorzeitige Veröffentlichungen aufzuspüren.

Ich lief in das gleiche Problem, aber es stellt sich heraus, dass ich einen dummen Fehler gemacht hatte:

ich ein Mitglied wie dies in der Header-Datei erklärt hatte:

NSMutableDictionary* myDict; 

Aber dann initialisiert es so in der .m-Datei:

myDict = [[NSDictionary alloc] init];

, die gültig und alles ist, weil die NSMutableDictionary aus der NSDictionary Klasse abgeleitet ist. Deshalb werden alle Anrufe, die tatsächlich geleisteten Arbeitsstunden von NSDictionary vererbt werden, aber die Anrufe spezifisch NSMutableDictionary [setObject: forKey:]. Fehlgeschlagen, weil ich versuchte, sie auf der übergeordneten Klasse aufrufen

Der Fehler war wirklich dumm, aber ich war auch die Tatsache, dass die Debugger berichteten die Art der myDict als etwas ganz anderes (weder NSDictionary, noch NSMutableDictionary) abgeworfen. Ich hoffe, dass dies einige andere müde Coder hilft: -)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top