2013-05-30 135 views
0

在我的应用程序中,我有一个视图,用户必须填写表单。但是,有时应用程序崩溃这里,在这个功能,就这么简单cacth值字段,并建立了一个网址,让iphone - 应用程序崩溃的形式

-(NSString*)urlToUpload{ 

    NSString *string1 =[[NSString alloc]init]; 
    string1= [NSString stringWithFormat:@"?nombre="]; 
    NSString *string2 = [string1 stringByAppendingString:nameAdded]; 

//crash here 

    NSString *string3 = [string2 stringByAppendingString:@"&horario="]; 
    NSString *string4 = [string3 stringByAppendingString:horarioAdded]; 


    NSString *string5 = [string4 stringByAppendingString:@"&info="]; 
    NSString *string6 = [string5 stringByAppendingString:infoAdded]; 

    NSString *string7 = [string6 stringByAppendingString:@"&offerta="]; 
    NSString *string8 = [string7 stringByAppendingString:offertaAdded]; 

    NSString *lat_string = [[[NSString alloc] initWithFormat:@"%f",locationToUpload2.latitude] autorelease]; 
    NSString *lon_string = [[[NSString alloc] initWithFormat:@"%f",locationToUpload2.longitude] autorelease]; 

    NSString *string9 = [string8 stringByAppendingString:@"&latitude="]; 
    NSString *string10 = [string9 stringByAppendingString:lat_string]; 

    NSString *string11 = [string10 stringByAppendingString:@"&longitude="]; 
    NSString *string12 = [string11 stringByAppendingString:lon_string]; 


    NSString *url1 = [NSString stringWithFormat:@"http://myserverside/mysql_up.php"]; 

    NSString *url = [url1 stringByAppendingString:string12]; 



    return url; 
} 

编辑:

似乎对nameAdded问题appers时,有一个白色的空间分割成textField(即MisterB不会崩溃,B先生是)。 但是我使用:

nameAdded =[[nameField.text stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 

和NSLog的给nameAdded的是老总%20B。

崩溃仍然出现...

+0

从我看到的代码中看到很多错误,但是我的第一个猜测是什么是错误的会在崩溃的行中出现“nameAdded”。这是一个属性? – rooster117

+2

请看http://www.raywenderlich.com/10209/my-app-crashed-now-what-part-1 – rmaddy

+0

谢谢maddy,我不知道那个教程。 – doxsi

回答

1

它看起来像nameAdded可能是你的问题的原因。这一点是否为零?

而且

  1. 你分配一个字符串,将其设置为String1中,然后立即设置STRING1至类功能stringWithFormat其分配另一个字符串。你也使用stringWithFormat,但你没有使用任何格式,所以你可以简单地使用NSString * string1 = @“?nombre =”;

  2. 而不是宣布所有这些变量,你应该只使用的NSMutableString和构建这一切在一个variabl

+0

只有当你想修改一个像插入/删除一个字符的字符串时,才需要NSMutableString。 ''NSString * s = @“first item”;'然后简单地's = [s stringAppendingString:@“xyz”];'和's = [s stringByAppendigFormat:@“%f”,var];'效果很好。 –

+0

@ ott--使用'NSMutableString'将大量元素附加在一起比将大量不可变的字符串附加到单独的变量中效率更高。 – rmaddy

+0

@maddy正如你在答案中所展示的那样,只使用一个NSString更加高效 - 它不需要自己的方法。 –

2

只需使用一个单一的stringWithFormat:

- (NSString *)urlToUpload { 
    NSString *url = [NSString stringWithFormat:@"http://myserverside/mysql_up.php?nombre=%@&horario=%@&info=%@&offerta=%@&latitude=%f&longitude=%f", 
     [nameAdded stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding], 
     [horarioAdded stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding], 
     [infoAdded stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding], 
     [offertaAdded stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding], 
     locationToUpload2.latitude, locationToUpload2.longitude]; 

    return url; 
} 

确保引用变量有效。

在您的原始代码中,不需要分配/ init一个NSString,然后将另一个字符串分配给相同的变量。这是内存泄漏(string1)。

如果你真的想按照自己的方式构造代码,至少应使用NSMutableString并追加到那个可变字符串中。创建一个以上的NSString变量是错误的方法。

更新:确保每个添加到URL的字符串都已正确转义。

+0

+1更简洁的代码;但是如果OP使用ARC,那么编译器应该在第一个alloc/init之后在'string1'上插入'release'。通过拆卸进行快速测试表明它确实如此。 – FluffulousChimp

+0

@NSBum由于OP的代码调用了'autorelease',我们知道ARC没有被使用。 – rmaddy

+0

oops - 没有足够的向右滚动以查看“autorelease”调用。谢谢。 – FluffulousChimp