Qu'est ce qu'un “Abandon piège” & comment puis-je le corriger?
Je reçois ce message à chaque fois que je compile mon projet:
RunIPhoneUnitTest.sh: line 92: 31389 Abort trap "$TARGET_BUILD_DIR/$EXECUTABLE_PATH" -RegisterForSystemEvents
Je comprends, c'est un problème dans mon code, mais je n'arrive pas à comprendre comment résoudre ou trouvé.
La chose étrange, c'est que je l'obtenir avec cet appel:
-- This is the interface
@interface DbObject : NSObject {
NSInteger Id;
NSDate* timeStamp;
}
@property (nonatomic) NSInteger Id;
@property (nonatomic, retain) NSDate *timeStamp;
----
This fail with above error
----
NSString * filter = [NSString stringWithFormat:"id = %@", ds.Id, nil];
MAIS le wird, c'est que je supprime cette ligne, la méthode et encore le faire! Mon fou.
Actuellement, je suis en train de penser à supprimer le code jusqu'à ce que pas une erreur & commencer à ajouter, mais me demande si il existe une solution plus pragmatique...
OriginalL'auteur mamcx | 2009-01-10
Vous devez vous connecter pour publier un commentaire.
Un abandon piège signifie généralement que abort a été appelé quelque part. Ceci est probablement dû au fait que votre unité de test de code de l'atelier est de lancer une exception qu'il ne s'attendait pas et tout simplement de la manipulation de ce par appel abort(3). L'abandon d'appel n'est pas très facile à déboguer, car il ne dispose d'aucune information concernant la personne qui l'a appelé ou pourquoi, ne retourne jamais et génère un SIGABRT. Vous pouvez en installer un nouveau gestionnaire pour SIGABRT et placez un point d'arrêt et puis il y en au moins examiner la pile d'appel en cours... mais lire la suite pour plus d'informations sur le pourquoi de ce qui se passe dans la première place.
Cependant, le problème avec votre code ci-dessus est que NSInteger n'est pas un type d'objet, il est un habitué primitive. Pour corriger votre erreur, remplacez le défaut de conformité avec le présent:
D'abord,
stringWithFormat
prend unNSString
objet en tant que paramètre, vous devez utiliser le caractère '@' pour indiquer que la chaîne de caractères littérale est une NSString. Ceci est très important car@"blah blah"
est en fait traduit par un objet. L'appel que vous faites pourstringWithFormat
attend la NSString l'information de l'objet à être un résident à l'adresse de mémoire, mais c'est plutôt d'obtenir une chaîne de caractères et est le plus susceptible d'exploser. Assurez-vous que tous vos littéraux de chaîne sont@"blah blah"
où un NSString type est prévu et qu'ils ne sont pas de simples c-strings.Deuxièmement, le caractère '@' dans la chaîne de format spécifie un objet. Depuis NSInteger n'est pas un objet, vous ne pouvez pas utiliser ce format de caractère. Au lieu d'utiliser %lld pour spécifier un long entier long. Enfin, vous n'avez pas besoin d'ajouter de la
nil
à la fin de la liste des paramètres lors de l'utilisation destringWithFormat
depuis la chaîne de format lui-même spécifie le nombre de paramètres à attendre.Que d'un côté, la raison pour laquelle
%lld
est utilisé au lieu de simplement%d
est que NSInteger change de taille en fonction de si vous êtes à la compilation pour un 32-bit ou 64-bit cible. Par la promotion de la NSInteger à lalong long
type et à l'aide de la%lld
spécificateur de vous assurez-vous que vous n'aurez pas de troncature de problèmes dans le futur si vous compilez pour 64 bits et votre NSInteger valeur nécessite plus de 32 bits pour stocker.OriginalL'auteur Jason Coco