NSString stringWithFormat导致iPhone应用程序崩溃

时间:2011-04-11 07:53:46

标签: iphone crash

当我使用NSString stringWithFormat构造动态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;在我的头文件中为此视图。

非常感谢任何帮助或指导!

谢谢, 添

4 个答案:

答案 0 :(得分:4)

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

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

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

与:相比:

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

首先,Cocoa约定说,因为你通过alloc消息导致了对象,你“拥有”它并负责释放它。

对于后者,惯例是因为你导致对象是由类“方便”方法创建的,所以你不拥有它,也不负责释放它。该类(此处为NSString)具有通过自动释放池释放的责任。

总而言之,当您使用alloc / init显式创建某些内容时,必须将其释放。当你使用[NSThing thingWithXXX]样式方法时,你不能。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

不要在release上拨打loginURL,因为你没有分配它,只有iOS有权销毁它......

使用以下代码

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

使用loginURL后,别忘了给release打电话......

   [loginURL release];

答案 3 :(得分:0)

这表明您的字符串已发布,当您在XML解析器中调用它时,它会崩溃该应用程序。

实际上stringWithForma t为字符串提供了一个autorelease对象。

所以你需要的,在.h中将你的字符串作为retain属性然后在.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];

它解决了你的问题。