当我使用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];