Проблема расщепления строк - PullRequest
1 голос
/ 20 сентября 2010

Я работаю над простой программой, в которой я разделяю строку, и пользователь глобальный, я использую следующий код для разбиения строки.

NSString *GlobleStr;//globale variable

    //===============
NSString *xmlParsingResult=@"Apple,iphone";
NSArray *array = [xmlParsingResult componentsSeparatedByString:@","];
NSString *StrResult = [NSString stringWithFormat:@"%@", [array objectAtIndex:0]];
GlobleStr =[NSString stringWithFormat:@"%@",[array objectAtIndex:1]];
NSLog(@"cmd %@",StrResult);
NSLog(@"value%@",GlobleStr);

мой код может разбить строку, и o / p является cmd: значение Apple: iphone

но моя проблема в том, что как только я вызову другой xib, моя глобальная переменная будет пустой или нулевой, и приложение вылетит (выдает error like Variable is not cfstring).

Есть предложения?

Ответы [ 2 ]

2 голосов
/ 20 сентября 2010

Это потому, что метод NSString + stringwithFormat: возвращает автоматически выпущенную строку.В локальной переменной это часто то, что вы хотите предотвратить утечки памяти (в противном случае вам придется вручную освобождать строку, когда вы закончите с ней).Проблема здесь в том, что строка в GlobleStr освобождается пулом автоматического выпуска через некоторое время после того, как вы назначаете ее, затем, когда вы пытаетесь получить доступ к ней в другом месте, вы получаете сбой.

Исправление таково: GlobleStr = [[NSString stringWithFormat: @ "% @", [array objectAtIndex: 1]] retain];

В качестве отступления, вы можете просто сделать это вместо этого:

GlobleStr = [[массив objectAtIndex: 1] сохранить];

Я настоятельно рекомендую прочитать документацию Apple по управлению памятью в Какао: http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/MemoryMgmt.html.

Наконец, не видя ваш код, я не могу сказать наверняка, но мне было бы интересно узнать, почему вы используете глобальную переменную для GlobleStr.Это общее утверждение, и, конечно, есть исключения, но при программировании в Какао, возможно, есть лучший способ структурировать ваш код.

1 голос
/ 20 сентября 2010

Вам необходимо retain ваш глобальный объект, иначе он будет освобожден, когда пул авто-релиза истощится:

GlobleStr = [[NSString stringWithFormat:@"%@", [array objectAtIndex:0]] retain];

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

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