NSString stringWithFormat导致iPhone应用程序崩溃

NSString stringWithFormat导致iPhone应用程序崩溃,iphone,crash,Iphone,Crash,当我使用NSString stringWithFormat构造一个动态URL,然后在XML解析器中使用该值时,我会随机崩溃。但是,如果我用一个常量字符串测试它,它工作得很好 这是我生成字符串的代码 loginURL = [NSString stringWithFormat:@"%@%@",ScriptURLString,@"authenticate"]; 结果呢, http://edms.digistorm.com.au/test/index.php?s=&sc=D41D8CD98F0

当我使用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;在该视图的头文件中

任何帮助或指导都将不胜感激

谢谢,
蒂姆

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

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

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

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

不要在
loginURL
上调用
release
,因为您尚未分配它,只有iOS有权销毁它

使用下面的代码

loginURL = [[NSString alloc] initWithFormat:@"%@%@",ScriptURLString,@"authenticate"];
一旦你使用了
loginURL
别忘了在上面调用
release

   [loginURL release];

不要在
loginURL
上调用
release
,因为您尚未分配它,只有iOS有权销毁它

使用下面的代码

loginURL = [[NSString alloc] initWithFormat:@"%@%@",ScriptURLString,@"authenticate"];
一旦你使用了
loginURL
别忘了在上面调用
release

   [loginURL release];

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

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

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

NSString *loginURL = [NSString stringWithFormat:@"%@authenticate", ScriptURLString];
对于第一种情况,Cocoa约定说,因为您通过alloc消息创建了对象,所以您“拥有”了它,并负责释放它

对于后者,约定是因为您使对象由类“便利”方法创建,所以您不拥有它,也不负责释放它。类(这里是NSString)具有通过自动释放池释放的职责


总之,当您使用alloc/init显式地创建某个对象时,必须释放它。当您使用
[NSThing thingWithXXX]
样式方法时,您不能使用。

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

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

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

NSString *loginURL = [NSString stringWithFormat:@"%@authenticate", ScriptURLString];
对于第一种情况,Cocoa约定说,因为您通过alloc消息创建了对象,所以您“拥有”了它,并负责释放它

对于后者,约定是因为您使对象由类“便利”方法创建,所以您不拥有它,也不负责释放它。类(这里是NSString)具有通过自动释放池释放的职责


总之,当您使用alloc/init显式地创建某个对象时,必须释放它。当你使用
[NSThing thingWithXXX]
风格的方法时,你不能这样做。

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

实际上,
stringWithForma
t为string提供了一个
autorelease
对象

所以,您需要的是,将字符串作为.h中的retain属性,然后在.m中合成它,并在dealoc方法中释放它

也要这样做,

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];

它解决了您的问题。

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

实际上,
stringWithForma
t为string提供了一个
autorelease
对象

所以,您需要的是,将字符串作为.h中的retain属性,然后在.m中合成它,并在dealoc方法中释放它

也要这样做,

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];

它解决了您的问题。

您能告诉我们它给出的错误吗?如果可能,从控制台复制stacktrace。您能告诉我们它给出的错误吗?如果可能,请从控制台复制stacktrace。您所说的常量字符串等效于
NSString*loginURL=[[NSString alloc]initWithFormat:@“%@authenticate”,ScriptURLString],这是错误的。由自动释放池处理并添加到自动释放池的Contant字符串。如果分配字符串,则您有责任释放它。但对于常量字符串,不能释放。第二个方法创建一个由NSString类拥有的字符串,该类还将其放入自动释放池中。所以常量字符串更可能是使用静态方法创建的字符串。@Alkimake完全正确,已经修复了它。我的意思是澄清他什么时候应该也不应该调用release,因为没有完整的代码,我们无法确定他在做什么,而且听起来他是在不应该的时候发布的。你说常量字符串相当于
NSString*loginURL=[[NSString alloc]initWithFormat:@“%@authenticate”是错的,ScriptURLString]。由自动释放池处理并添加到自动释放池的Contant字符串。如果分配字符串,则您有责任释放它。但对于常量字符串,不能释放。第二个方法创建一个由NSString类拥有的字符串,该类还将其放入自动释放池中。所以常量字符串更可能是使用静态方法创建的字符串。@Alkimake完全正确,已经修复了它。我的意思是澄清他什么时候应该,什么时候不应该调用release,因为没有完整的代码,我们无法确定他在做什么,听起来他是在不应该的时候发布的。这也是错误的。tempString还可以,但每次使用retain而不释放时,都会导致memoney泄漏。您还没有定义如何创建loginURL属性。它是(保留)或(分配)。如果是(retain),则应使用
self.loginURL=[NSString stringWithFormat:@“%@%@”、ScriptURLString、@“authenticate”]。没有保留和自我。您还可以使用tempString和
[[NSString alloc]initWithFormat:@“%@%@”、ScriptURLString、@“authenticate”]等技术@Alkimake,我已经提到了