NSString字符串WithFormat导致iPhone应用程序崩溃



当我使用NSString字符串WithFormat构造动态URL,然后在XML解析器中使用该值时,我会出现随机崩溃。然而,如果我用一个常量字符串测试它,它会很好。。。

这是我生成字符串的代码,

loginURL = [NSString stringWithFormat:@"%@%@",ScriptURLString,@"authenticate"];

这导致

http://edms.digistorm.com.au/test/index.php?s=&sc=D41D8CD98F00B204E9800998ECF8427E&m=authenticate

然后我在我的XML解析器中使用它

XMLReturnData = [[NSMutableArray alloc] init];
xml = [[XMLParser alloc] 
       initWithXMLPath:loginURL 
       lookForElement:@"Authenticate" 
       setCallbackObject:self 
       withSelector:@selector(dataReady) 
       data:XMLReturnData
       ];

由于某种原因,这导致我的应用程序崩溃。如果我使用一个常量字符串,比如

loginURL = @"http://edms.digistorm.com.au/test/index.php?s=&sc=D41D8CD98F00B204E9800998ECF8427E&m=authenticate";

它运行良好。。。

loginURL定义为NSString*loginURL;在该视图的头文件中。

如有任何帮助或指导,我们将不胜感激!

谢谢,Tim

用于分配字符串的方法很重要。

分配字符串有两种基本方法:

NSString *loginURL = [[NSString alloc] initWithFormat:@"%@authenticate", ScriptURLString];

与相比

NSString *loginURL = [NSString stringWithFormat:@"%@authenticate", ScriptURLString];

首先,Cocoa约定说,因为你通过分配消息创建了对象,所以你"拥有"了它,并负责释放它

对于后者,约定是,因为您使用类"便利"方法创建了对象,所以您不拥有它,也不负责释放它。类(此处为NSString(负有通过自动释放池释放的责任。

总之,当你用alloc/init显式地创建东西时,你必须释放它。当你使用[NSThing thingWithXXX]风格的方法时,你不能。

这表明您的字符串被释放,当您在XML解析器中调用它时,它会崩溃应用程序。

实际上CCD_ 2t为字符串提供了一个CCD_。

所以你需要的是,让你的字符串在.h中保留属性,然后在.m中合成它,并在dealloc方法中释放它。

也这样做,

viewDidLoad

NSString *tempString=[[NSString alloc] init];  //using this because your string is retain type so it prevent increment in retain count.
self.loginURL=tempString;
[tempString release];

现在,当你使用stringWithFormat时,像这样使用

self.loginURL = [[NSString stringWithFormat:@"%@%@",ScriptURLString,@"authenticate"] retain];

它解决了你的问题。

不要在loginURL上调用release,因为你还没有分配它,只有iOS有权销毁它…

使用以下代码

loginURL = [[NSString alloc] initWithFormat:@"%@%@",ScriptURLString,@"authenticate"];

一旦你使用了loginURL,不要忘记在上面调用release。。。

   [loginURL release];

试试这个,它可能会对你有所帮助。

loginURL = [NSString stringWithFormat:@"%@authenticate",ScriptURLString];

最新更新