0

我的 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]; } else { strData = [洞察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"]];  

}

4

2 回答 2

4

所以这意味着您正在尝试- stringByReplacingOccurrencesOfString在一个实例上使用该方法,该实例NSDictionary当然不会起作用。

对象strData不是NSString你想的那样的对象。它实际上是一个对象NSDictionary

于 2012-10-01T08:59:24.163 回答
1

正如彼得上面所说,当你从一个对象中检索一个对象时,NSArray它只是一个指向对象的指针,不管你把它转换成什么。您可以通过各种方式对此进行调查。查看数组内容的设置位置并检查您要添加的内容,有可能NSDictionary在链的上游被误投了。还可以尝试在读取数组之前设置断点,然后在调试器中键入po insights。这将打印对象的内容。崩溃后,您还可以通过执行 a 来调查导致问题的对象po <memory address>,在这种情况下po 0x99f60b0

防止这种事情的一个好方法是自省(虽然如果你的数组中有错误的对象,这不会解决问题,但会阻止崩溃。)如下:

if ([strData isKindOfClass:[NSString class]]) {
    NSString *strReplace = [NSString stringWithFormat:@"%@",[strData stringByReplacingOccurrencesOfString:@"%20" withString:@" "]];   
}

尽管我注意到了几件事,但我在您发布的代码中看不到任何错误。您无需检查是否single == nil. 不可能nilNSArray.

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

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

于 2012-10-01T09:07:29.447 回答