Получение странных прерывистых исключений «нераспознанный селектор» в приложении iPhone - PullRequest
3 голосов
/ 18 сентября 2010

В последнее время я получаю периодические сообщения об ошибках из моего приложения, заявляющие о «нераспознанном селекторе» в областях, которые не могут их вызвать, и все же они делают.

Например, этот:

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

Это ОС, отправляющая предупреждение о памяти моему приложению, и каким-то образом класс приложения превратился в строку.

Кажется, что это происходит намного чаще, когда код вызывается через NSOperation:

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

Код, о котором идет речь:

[textures setObject: texture forKey: filename];

текстуры типа NSMutableDictionary * и никогда не переназначаются или не освобождаются (естественно, так как это объект кеша).Это единственное место, где setObject вызывается в этом методе, но согласно трассировке стека, текстуры были строкой.

Я также получаю эту странность:

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

Эта трассировка отследующий код в CCTextureCache:

CCTexture2DPixelFormat pixelFormat = [self getPixelFormatForIdentifier: identifier];

То, как CCTextureCache изменился на NSConcreteNotification после того, как он уже вызвал несколько методов, вызывает недоумение, если не сказать больше.

Кто-нибудь еще заметил подобные вещи?Я как-то получаю повреждение памяти?

Ответы [ 3 ]

1 голос
/ 18 сентября 2010

Вы проверяли некоторые условия гонки на предмет многопоточности?Кажется, что какой-то ресурс освобожден другим потоком, и текущий поток отправляет сообщение освобожденному объекту.

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
0 голосов
/ 22 марта 2011

Я только что столкнулся с той же проблемой, но оказалось, что я сделал глупую ошибку:

Я объявил такого члена в заголовочном файле:

NSMutableDictionary* myDict; 

Но затем инициализировал его так в файле .m:

myDict = [[NSDictionary alloc] init];

, который действителен и все, потому что NSMutableDictionary является производным от класса NSDictionary. Поэтому все вызовы, которые унаследованы от NSDictionary, на самом деле работали, но вызовы, специфичные для NSMutableDictionary [setObject: forKey:], были неудачными, потому что я пытался вызвать их в родительском классе.

Ошибка была действительно глупой, но я также был сбит с толку тем фактом, что отладчик сообщил о типе myDict как о чем-то совершенно ином (ни NSDictionary, ни NSMutableDictionary). Надеюсь, это поможет другому уставшему программисту: -)

0 голосов
/ 18 сентября 2010

Это часто вызывается ошибками управления памятью. Вы пробовали зомби ?

... с включенными зомби сообщения на освобожденные объекты больше не будут вести себя странно или сбой в трудных для понимания способах, но вместо этого будет регистрировать сообщение и умереть предсказуемым и прерывистым способом. Это инструмент для использования при попытке отследить перевыпуски и преждевременные выпуски.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...