当我使用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;在我的头文件中为此视图。
非常感谢任何帮助或指导!
谢谢, 添
答案 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];
它解决了你的问题。