2010-09-20 2 views
1

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

NSString *GlobleStr;//globale variable 

    //=============== 
NSString *[email protected]"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); 

мой код может разделить строку и о/р CMD: Apple значение: iphone

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

Любые предложения?

+0

Редактировать код –

ответ

2

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

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

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

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

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

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

1

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

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

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