我的iPhone应用程序崩溃并显示[__NSCFDictionary stringByReplacingOccurrencesOfString:withString:]:无法识别的选择器发送到实例

时间:2012-10-01 08:55:11

标签: ios string

我的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"]];  

}

2 个答案:

答案 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 == nilnil中无法NSArray

此外,您正在进行大量的指针重新分配,并尝试在循环遍历数组时编辑数组的内容。这在Objective-C中不是一个好主意。我已经测试了它,它似乎适用于这种情况,但是如果你要创建一个新的字符串,通常最好创建一个新的字符串指针,以确保正确释放旧字符串使用的内存。不要误解代码的工作原理,但是这种事情很快就会导致内存泄漏,以后很难追查,只是最好的实践。

关于崩溃,我看不到从该方法生成的错误消息,以及您发布的原始代码在哪里适合您发布的额外代码?请更新您的问题以了解更多详情