Я сейчас учусь программировать на iPhone.
В настоящее время у меня есть небольшое тестовое приложение с макетной клавиатурой, поэтому у меня есть несколько кнопок, которые при нажатии должны поместить текст в метку.
Затем я беру то, что на этикетке, и использую его, чтобы открыть ABUNKnownPersonControllerView для использования там. Просто базовое приложение, чтобы привыкнуть к нескольким вещам в iPhone.
Кажется, что у меня проблемы с работой со строкой, используемой для отображения того, что я хочу на этикетке. Я получаю ошибку EXC_BAD_ACCESS, поэтому я перечитал документы по управлению памятью, но нигде не могу найти утечки памяти.
Так что я думаю, что моя проблема в том, что я неправильно работаю со строкой. Мой код выглядит следующим образом:
// Заголовочный файл
@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;
// Файл реализации
- (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"];
}
И представление showUnknownPerson в файле реализации:
-(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);
}
И сделка:
- (void)dealloc
{
[phoneNumber release]; //@synthesize
// [номер выпуска]; //@синтезировать
[супер сделка];
}
Я пытался использовать изменяемую строку, но у меня та же ошибка, я также пытался не выпускать UILabel и NSString, и у меня та же проблема.
Когда мое приложение загружается, если я нажимаю одну кнопку и в метке появляется один символ, если я затем использую showUnknowPersonViewController, все работает нормально, если я нажимаю кнопку 1, а затем кнопку 2, чтобы я знал, что в UILabel есть два символа («12») и выберите использование showUnknownPersonViewcontroller, тогда я получаю сбой.
*** -[CFString release]: message sent to deallocated instance 0x1226a0
Однако я не понимаю, где это может быть освобождено?
Возможно, это что-то простое, что я пропустил в уроках, но я не могу понять, кто-нибудь может увидеть, что я могу делать неправильно?
РЕДАКТИРОВАТЬ: Просто добавить, если self.phoneNumber.text (UILabel) возвращает пустой или один символ, он работает нормально, однако если его 2 или более я получаю сбой.
РЕДАКТИРОВАТЬ 2 : Я полностью удалил строку NSString из кода, и у меня все еще остается та же проблема, так что, похоже, UILabel вызывает эту проблему? См. Код, измененный выше.