iPhone - Comment changer la Chaîne de l'Étiquette correctement?
Je suis actuellement en apprentissage de la programmation sur iPhone.
J'ai actuellement une petite application de test avec une maquette du clavier, donc j'ai quelques boutons qui lorsqu'il est pressé devez placer du texte dans un label.
Je puis prendre ce qui est dans l'étiquette et l'utiliser pour ouvrir un ABUNKnownPersonControllerView pour l'utilisation il. Juste une application de base de s'habituer à un peu de choses dans l'iPhone.
Où j'ai de la difficulté semble être à travailler avec la chaîne de caractères utilisée pour afficher ce que je veux dans l'étiquette. Je reçois le EXC_BAD_ACCESS d'erreur donc j'ai relu la gestion de la mémoire docs mais je ne peux pas le trouver n'importe où qu'il devrait y avoir une fuite de mémoire.
Je pense donc que mon problème est que je suis incorrecte de travail à la Chaîne. Mon code est comme suit:
//Fichier d'en-tête
@interface KeyPadViewController : UIViewController <ABUnknownPersonViewControllerDelegate>{
IBOutlet UILabel *phoneNumber;
//NSString *number;
}
@property (nonatomic, retain) UILabel *phoneNumber;
//@property (nonatomic, retain) NSString *number;
-(IBAction)addNum1;
-(IBAction)addNum2;
-(IBAction)showUnknownPersonViewController;
//Fichier d'implémentation
- (void)viewDidLoad
{
[super viewDidLoad];
self.title = NSLocalizedString(@"Keypad",@"Keypad");
//self.number = @"";
self.phoneNumber.text = @"";
}
-(IBAction)addNum1{
//self.number = [self.number stringByAppendingString:@"1"];
self.phoneNumber.text = [self.phoneNumber.text stringByAppendingString:@"1"];
}
-(IBAction)addNum2{
//self.number = [self.number stringByAppendingString:@"2"];
self.phoneNumber.text = [self.phoneNumber.text stringByAppendingString:@"2"];
}
Et la showUnknownPerson vue de la mise en œuvre de fichier:
-(void)showUnknownPersonViewController
{
//NSString *contactNum = self.phoneNumber.text;
ABRecordRef aContact = ABPersonCreate();
CFErrorRef anError = NULL;
ABMultiValueRef email = ABMultiValueCreateMutable(kABPersonPhoneProperty);
bool didAdd = ABMultiValueAddValueAndLabel(email, self.phoneNumber.text, kABPersonPhoneMobileLabel, NULL);
if (didAdd == YES)
{
ABRecordSetValue(aContact, kABPersonPhoneProperty, email, &anError);
if (anError == NULL)
{
ABUnknownPersonViewController *picker = [[ABUnknownPersonViewController alloc] init];
picker.unknownPersonViewDelegate = self;
picker.displayedPerson = aContact;
picker.allowsAddingToAddressBook = YES;
picker.allowsActions = YES;
[self.navigationController pushViewController:picker animated:YES];
[picker release];
}
else
{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error"
message:@"Could not create unknown user"
delegate:nil
cancelButtonTitle:@"Cancel"
otherButtonTitles:nil];
[alert show];
[alert release];
}
}
CFRelease(email);
CFRelease(aContact);
}
Et le dealloc:
- (void)dealloc
{
[phoneNumber release]; //@synthesize
//[numéro de release]; //@synthétiser
[super dealloc];
}
J'ai essayé d'utiliser une Mutable chaîne, mais ont la même erreur, j'ai aussi essayé de ne pas relâcher la UILabel et la NSString et ont le même problème.
Lorsque mon application se charge si j'appuie sur un bouton et d'un caractère apparaît sur l'étiquette, si je puis utiliser le showUnknowPersonViewController tout fonctionne bien, si j'appuie sur le bouton 1 et le bouton 2 de sorte que je connais ont deux caractères dans le UILabel ("12") et sélectionnez pour utiliser le showUnknownPersonViewcontroller puis-je obtenir le crash.
*** -[CFString release]: message sent to deallocated instance 0x1226a0
Cependant, je ne comprends pas d'où il pourrait être libéré?
C'est probablement quelque chose de base que j'ai manqué dans les tutoriels mais je ne peux pas le comprendre, n'importe qui peut voir ce que je fais de mal?
EDIT: Juste pour ajouter que si l'auto.numéro de téléphone.texte (UILabel) renvoie soit vide ou d'un caractère, il fonctionne très bien cependant, si ses 2 ou plus-je obtenir le crash.
EDIT 2: j'ai enlevé mon NSString du code complètement et j'ai toujours le même problème, de sorte qu'il ressemble à son la UILabel c'est à l'origine du problème? Voir modification du code ci-dessus.
- Ne savez-vous pas que la ligne de l'incident en apparence? Essayez d'activer NSZombieEnabled, voir si elle vous obtient plus loin!
- J'ai ajouté NSZombieEnabled pour le débogueur, mais je suis en utilisant Xcode 4 et je ne peux pas sembler obtenir travail pour me montrer la ligne où il est en panne, quand je le lance, il a toujours des chaussures de moi cette ligne : int retVal = UIApplicationMain(argc, argv, nil, nil);
Vous devez vous connecter pour publier un commentaire.
Je pense que le problème peut être dans la ligne:
Vous êtes réglage auto.numéro de téléphone.le texte à la même chaîne que le numéro, pas d'une copie ou d'une chaîne nouvellement créée avec le même contenu. Ainsi, dans votre addNum méthodes, le setter de la propriété des communiqués de la chaîne quand il remet sa valeur. La deuxième propriété est encore de pointage à la sortie de la chaîne. Lorsque le setter de la deuxième propriété est appelée, elle cherche à se libérer de cette chaîne de nouveau. Par conséquent, l'erreur.
Si ce n'est le problème, il pourrait être résolu par une réécriture de la ligne comme:
Bien que, même cela n'est probablement pas nécessaire. Toutes les variables d'instance sont initiés à néant, et il ne serait pas nécessaire de donner une valeur initiale.
Je suppose que votre NSString variable nombre est à l'origine du problème. Il semble que les valeurs que vous attribuez à cette variable ne sont pas conservés n'importe où. Comme vous utilisez auto d'accéder à la variable phoneNumber, vous avez besoin de l'utiliser pour accéder à la nombre trop. À l'aide de auto appelle le setter de la propriété particulière où les biens sont effectivement conservés.
Je crois que la propriété peut également être déclaré comme un IBOutlet, et, si oui, qui pourrait être à l'origine du problème.
Il semble que vous ne prévoyons pas de numéro. Quelle est la valeur initiale de numéro?
À mon avis, vous devez affecter une chaîne de caractères dans votre viewDidLoad