iPhone - Как правильно изменить строку в метке? - PullRequest
0 голосов
/ 15 апреля 2011

Я сейчас учусь программировать на 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 вызывает эту проблему? См. Код, измененный выше.

Ответы [ 4 ]

4 голосов
/ 15 апреля 2011

Я думаю, что проблема может быть в строке:

self.phoneNumber.text = number;

Вы устанавливаете self.phoneNumber.text для той же строки, что и число, а не для копии или только что созданной строки с тем же содержимым. Таким образом, в ваших методах addNum установщик одного свойства освобождает строку при сбросе ее значения. Второе свойство все еще указывает на освобожденную строку. Когда вызывается установщик второго свойства, он снова пытается освободить эту строку. Отсюда и ошибка.

Если это проблема, ее можно решить, переписав строку следующим образом:

self.phoneNumber.text = @"";

Хотя даже это, вероятно, и не нужно. Все переменные экземпляра инициализируются значением nil, и нет необходимости указывать ему начальное значение.

1 голос
/ 15 апреля 2011

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

@property (nonatomic, retain) IBOutlet UILabel *phoneNumber;
1 голос
/ 15 апреля 2011

Кажется, вы никогда не выделяете номер.Каково начальное значение числа?На мой взгляд, вы должны выделить строку в вашем viewDidLoad

1 голос
/ 15 апреля 2011

Я думаю, ваша NSString переменная число вызывает проблему. Кажется, значения, которые вы назначаете этой переменной, нигде не сохраняются. Поскольку вы используете self для доступа к переменной phoneNumber , вам необходимо использовать ее также и для доступа к номеру . Использование self вызывает установщик для конкретного свойства, где свойство фактически сохраняется.

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