我正在开发一个简单的程序,我在其中分割字符串和用户全局,我使用以下代码来分割字符串。
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,那么我的全局变量将为空或nil,应用程序将崩溃(它会抛出error like Variable is not cfstring
)。
有什么建议吗?
答案 0 :(得分:2)
这是因为NSString的+ stringwithFormat:方法返回一个自动释放的字符串。在本地变量中,这通常是您希望防止内存泄漏的原因(否则您必须在完成后手动释放该字符串)。这里的问题是GlobleStr中的字符串在分配后会被自动释放池释放,然后当您尝试在另一个地方访问它时会发生崩溃。
修复是这样的:GlobleStr = [[NSString stringWithFormat:@“%@”,[array objectAtIndex:1]] retain];
顺便说一句,你可以这样做:
GlobleStr = [[array objectAtIndex:1] retain];
我强烈建议您阅读Apple有关Cocoa内存管理的文档:http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/MemoryMgmt.html。
最后,在没有看到你的代码的情况下我无法肯定地说,但我很想知道你为什么要为GlobleStr使用全局变量。这是一个全面的陈述,当然也有例外,但是在使用Cocoa进行编程时,可能有更好的方法来构建代码。
答案 1 :(得分:1)
你需要retain
你的全局,否则当自动释放池耗尽时它将被解除分配:
GlobleStr = [[NSString stringWithFormat:@"%@", [array objectAtIndex:0]] retain];
请记得稍后完成时release
- 特别是之前为其分配任何其他值。