我的iPhone应用程序崩溃并显示错误:
- [__NSCFDictionary stringByReplacingOccurrencesOfString:withString:]: unrecognized selector sent to instance 0x99f60b0
这是我的代码
NSString * strData;
AppDelegate * delegate =(AppDelegate *)[[UIApplication sharedApplication] delegate];
if(delegate.respondInsightIndex)
{
strData = [insights objectAtIndex:index];
}
其他
{
strData = [insights lastObject];
}
NSString *strReplace = [NSString stringWithFormat:@"%@",[strData stringByReplacingOccurrencesOfString:@"%20" withString:@" "]];
这是我再次发生崩溃的方法
- (void) setComments:(NSArray*)comments {
NSString * htmlString;
if ( [UIHelper isPad] )
htmlString = @"<html><style type=\"text/css\">body{padding:15px 40px 0 40px; font-family: Helvetica;"
"font-size: 14px;"
"color: #888888;"
"line-height: 50%"
"},</style><body>";
else
htmlString = @"<html><style type=\"text/css\">body{padding:8px 20px 0 20px; font-family: Helvetica;"
"font-size: 11px;"
"color: #888888;"
"},</style><body>";
for ( NSString * single in comments ) {
if ( single == nil )
single = @"";
if ([single isKindOfClass:[NSString class]]) {
single = [single stringByReplacingOccurrencesOfString:@"%20" withString:@" "];
}
NSString * str ;
if([UIHelper isPad ])
{
str = [NSString stringWithFormat:@"%@<br/><hr color=#555555><p align=\"right\" style=\"font-size:12px;\">Username</p>", single];
}
else {
str = [NSString stringWithFormat:@"%@<br/><hr color=#555555><p align=\"right\" style=\"font-size:9px;\">Username</p>", single];
}
htmlString = [NSString stringWithFormat:@"%@%@", htmlString, str];
}
htmlString = [NSString stringWithFormat:@"%@%@", htmlString, @"</body></html>"];
if ( [contentView respondsToSelector:@selector(loadHTMLString:baseURL:)] )
[contentView loadHTMLString:htmlString baseURL:[NSURL URLWithString:@"http://www.secondprizm.com"]];
}
答案 0 :(得分:4)
这意味着您尝试在- stringByReplacingOccurrencesOfString
的实例上使用方法NSDictionary
,这当然不起作用。
对象strData
不是您认为的NSString
对象。它实际上是NSDictionary
的对象。
答案 1 :(得分:1)
正如彼得所说,当你从NSArray
中检索一个对象时,它只是一个指向一个对象的指针,无论你把它投射到什么。您可以通过各种方式对此进行调查。查看数组内容的设置位置并检查您要添加的内容,NSDictionary
可能会被错误地转移到链上。还要尝试在读取数组之前设置断点,然后键入调试器po insights
。这将打印对象的内容。崩溃后,您还可以通过执行po <memory address>
调查导致问题的对象,在本例中为po 0x99f60b0
。
防范此类事情的一个好方法是内省(虽然如果你的数组中有错误的对象,但不会解决问题,但会停止崩溃。)如下:
if ([strData isKindOfClass:[NSString class]]) {
NSString *strReplace = [NSString stringWithFormat:@"%@",[strData stringByReplacingOccurrencesOfString:@"%20" withString:@" "]];
}
我看不到你发布的代码中的任何错误,尽管我注意到了一些事情。您无需检查是否single == nil
。 nil
中无法NSArray
。
此外,您正在进行大量的指针重新分配,并尝试在循环遍历数组时编辑数组的内容。这在Objective-C中不是一个好主意。我已经测试了它,它似乎适用于这种情况,但是如果你要创建一个新的字符串,通常最好创建一个新的字符串指针,以确保正确释放旧字符串使用的内存。不要误解代码的工作原理,但是这种事情很快就会导致内存泄漏,以后很难追查,只是最好的实践。
关于崩溃,我看不到从该方法生成的错误消息,以及您发布的原始代码在哪里适合您发布的额外代码?请更新您的问题以了解更多详情