Справка NSMutableString Цель C

В настоящее время у меня есть следующий код:

-(void) inputNumber:(int)number {

    NSString *str;

    str = [NSString stringWithFormat:@"%d", number];
    [strVal appendString:str];
    txtShowNum.text = strVal;
}

Я уже определил NSMutableString *strVal; раньше в моем коде.

Когда функция выше выполняется, поле остается пустым, но если бы я использовал:

txtShowNum.text = str;

Я получаю значение, которое мне нужно, но мне, очевидно, нужно конкатенировать значение.

Может кто-нибудь пролить некоторый свет на это.

Спасибо


person Sandeep Bansal    schedule 04.04.2011    source источник
comment
Когда вы говорите, что определено, вы имеете в виду, что оно было инициализировано или только что объявлено? Например: NSString* strVal = @; ?   -  person kailoon    schedule 04.04.2011


Ответы (3)


Вы также должны выделить NSMutableString в своем коде, где-то перед вызовом этого метода.

Например. нравится:

-(void) inputNumber:(int)number {
    if ( strVal == nil ) strVal = [[NSMutableString alloc] init];
    NSString *str = [NSString stringWithFormat:@"%d", number];
    [strVal appendString:str];
    txtShowNum.text = strVal;
}

Однако здесь есть некоторые проблемы с памятью. Вам лучше сделать strVal сохраненным свойством, а затем сделать:

    if ( self.strVal == nil ) self.strVal = [NSMutableString string];
person mvds    schedule 04.04.2011
comment
Кажется, это решило проблему вывода, но теперь, когда метод вызывается снова, приложение просто вылетает. Есть ли в этом коде что-то, что приведет к сбою приложения? - person Sandeep Bansal; 04.04.2011
comment
Если строка не сохраняется, этот код приведет к сбою приложения. У вас есть строка, говорящая @property (nonatomic,retain) NSMutableString strVal; в вашем заголовке, и вы используете self.strVal = ...? Тогда не должно падать. - person mvds; 04.04.2011
comment
Спасибо, вот в чем проблема, для реализации также нужен @synthesize, просто примечание, если кто-то еще придет, чтобы прочитать этот вопрос. - person Sandeep Bansal; 04.04.2011

Ваш strVal, скорее всего, nil, поэтому вы вызываете appendString: на nil, что по существу вообще ничего не делает, а установка текстового поля на nil удалит его содержимое.

person Eiko    schedule 04.04.2011

Если вы только что объявили его как переменную-член, обязательно инициализируйте его где-нибудь:

NSMutableString* strVal = @"";

Если нет, вы просто вызываете метод для нулевого объекта.

person kailoon    schedule 04.04.2011
comment
-1, @"" — это статически выделенная NSString, а не NSMutableString. - person mvds; 04.04.2011
comment
Да, ты прав. Я разместил это поспешно. Это должно быть NSMutableString* strVal = [NSMutableString alloc] init]; - person kailoon; 04.04.2011
comment
Что приведет к утечке памяти, если ее не обработать должным образом, лучше использовать [NSMutableString string] для ее автоматического освобождения. (или добавить звонок autorelease) - person mvds; 04.04.2011