Приложение симулятора iPhone падает при добавлении строки - PullRequest
0 голосов
/ 04 мая 2010

Я полный новичок, так что я, вероятно, упускаю что-то действительно простое, но я не могу заставить свою строку начать работать. Я добавляю третий символ в typedDigit, и он вылетает - метод вызывается нормально, а typedDigit будет иметь длину до 2 символов. Я думаю, что все правильно объявлено в заголовочном файле. Код -

-(IBAction)digitPressed:(UIButton *)sender {

    NSString *digit = [[sender titleLabel] text]; // in this case, "0" - "9"

    if (userIsInMiddleOfTyping) {   // typedDigit is already at least 1 character long
        typedDigit = [typedDigit stringByAppendingString:digit];
    } else {                        // first character of typedDigit
        typedDigit = digit;
        userIsInMiddleOfTyping = YES;
    }

}

Большое спасибо за любую помощь!

Ответы [ 3 ]

1 голос
/ 04 мая 2010

Без отслеживания сбоя в стеке трудно понять причину, но я предполагаю, что typedDigit автоматически высвобождается перед следующим вызовом вашей функции digitPressed. stringByAppendingString: возвращает автоматически выпущенный объект, поэтому вам нужно retain, если вы хотите, чтобы он прошел после следующей очистки пула автоматического выпуска. Для прямого исправления попробуйте что-то вроде ...

if (userIsInMiddleOfTyping) {
  typedDigit = [[[typedDigit autorelease] stringByAppendingString:digit] retain];
} else {  
  typedDigit = [digit retain];
  ...

Более того, вам нужно убедиться, что вы набрали release typedDigit в какой-то момент после окончания набора текста, и вы покончили с этим.

0 голосов
/ 04 мая 2010

Я думаю, что у вас, вероятно, есть проблема с владением. Если typeDigit является переменной экземпляра объекта, вы должны установить ее с помощью метода установки. В любом случае, вы никогда не вызываете «retain» в строках, которые хотите сохранить, поэтому они, вероятно, освобождаются за вашей спиной между вызовами методов.

0 голосов
/ 04 мая 2010

Вы хотите убедиться, что цифра не равна NULL при попытке ее добавления. Также нет упоминания об инициализации typedDigit, поэтому, если это указатель мусора или иным образом плохо инициализированный, вы потерпите крах при попытке манипулировать им.

...