Je ne crains pas que Google ait été capable de sauver mon hyde. Je semble avoir une erreur SIGABRT à chaque fois que je touche l'écran du téléphone, sur n'importe quel UIView. Les messages de la console de débogage cette erreur avant la SIGABRT:SIGABRT sur n'importe quelle touche UIView
.... [310:207] *** -[UIView _exclusiveTouchView]: unrecognized selector sent to instance 0x14c0c0
.... [310:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[UIView _exclusiveTouchView]: unrecognized selector sent to instance 0x14c0c0'
(ce n'est pas mon appel spécifique à _exclusiveTouchView
, bien sûr.)
Je signalerais volontiers un code, mais la vérité est que je ne peux pas trouver (ou devinez) d'où vient ce problème. Cela ne se produit pas sur un seul UIView, mais sur tous les UIViews de ma pile. Je peux résumer la logique d'affichage, cependant, peut-être que cela va faire la lumière. Par conséquent, l'application est créée et une interface utilisateur est allouée. Un seul viewcontroller est alors alloc'd, ce qui fait et ajoute son propre self.view vide, auquel les autres UIViews, représentant les différents états du jeu, sont attachés.
Il est intéressant de noter que cette erreur ne se produit PAS sur le simulateur, mais se produit régulièrement sur le périphérique. Et je devrais également mentionner que l'application n'a pas encore de remplacer/utiliser l'un des touchesBegan:/Ended:/Moved: etc ... En d'autres termes, cette erreur se produit sans ces méthodes dans le code.
Je ne comprends vraiment pas d'où vient cette erreur ... Des suggestions?
EDIT pour le code demandé est ici un état simplifié qui génère encore SIGABRT touch:
#import <UIKit/UIKit.h>
#import "WPGame.h"
@class WPGame;
extern WPGame *theGame;
#import "WPGameState.h"
@class IntroView;
@interface IntroStateView : WPGameState {
NSTimer *introTimer;
}
+(IntroStateView*)instance;
@end
.
#import "IntroStateView.h"
#import "StartMenuStateView.h"
static IntroStateView *theOnlyIntro = nil;
@implementation IntroStateView
+(IntroStateView*)instance {
@synchronized(self) {
if (!theOnlyIntro) {
theOnlyIntro = [[IntroStateView alloc] init];
}
}
return theOnlyIntro;
}
- (void)excuseYourself {
[self changeStateOf:theGame toState:[StartMenuStateView instance]];
}
- (void)startUp {
[super startUp];
introTimer = [NSTimer scheduledTimerWithTimeInterval:[theGame introLength]
target:self
selector:@selector(excuseYourself)
userInfo:NULL
repeats:NO];
}
- (void)cleanUp {
[super cleanUp];
}
- (void)handleEvents:(WPGame*)game {
[super handleEvents:game];
}
- (void)dealloc {
theOnlyIntro = nil;
[super dealloc];
}
@end
et si vous avez besoin de voir des parties de la sous-classe WPGameState de UIView, il peut être trouvé ici pour économiser la longueur du message: http://tinypaste.com/732bb
Veuillez fournir le code de sous-classe UIView le plus simple qui reproduit le problème. Nous serons en mesure d'aider à partir de là. –
Je ne sais pas si elle est directement liée, mais en utilisant une vue singleton est définitivement abus de singleton. Les vues devraient être stupides et interchangeables. Chaque vue doit avoir assez de logique pour gérer ses besoins d'affichage immédiat. Ils ne devraient pas avoir une logique d'application critique en eux telle qu'une seule par application doit exister. Vous devez repenser votre conception. – TechZen
@TechZen - en termes de conception, ce sont des vues uniques responsables de la plupart de son propre environnement qui représentent des joueurs individuels. ils sont censés avoir une logique critique, mais pas la logique de l'application. Je suis d'accord, cependant, les applications non-jeu devraient rester à l'écart des vues singleton. – bitcruncher