0

iPhoneアプリケーションがクラッシュしてエラーが表示されます:

- [__NSCFDictionary stringByReplacingOccurrencesOfString:withString:]: unrecognized selector sent to instance 0x99f60b0

これが私のコードNSString*strDataです。AppDelegate * delegate =(AppDelegate *)[[UIApplicationsharedApplication]デリゲート]; if(delegate.respondInsightIndex){strData = [insights objectAtIndex:index]; } else {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"]];  

}

4

2 に答える 2

4

つまり、もちろん機能しない- stringByReplacingOccurrencesOfStringインスタンスでメソッドを使用しようとしているということです。NSDictionary

オブジェクトは、あなたが思っているようstrDataなオブジェクトではありません。NSString実際にはのオブジェクトですNSDictionary

于 2012-10-01T08:59:24.163 に答える
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 ではあまり良い考えではありません。テストしたところ、この場合はうまくいくようですが、新しい文字列を作成する場合は、古い文字列が使用していたメモリが正しく解放されるように、新しい文字列ポインタを作成することをお勧めします。コードが機能すると誤解しないでください。ただし、この種のことは、後で追跡するのが難しいメモリ リークにすぐにつながる可能性があります。

クラッシュに関しては、そのメソッドから生成されたエラー メッセージが表示されません。投稿した元のコードは、投稿した余分なコードのどこに収まりますか? 詳細について質問を更新してください

于 2012-10-01T09:07:29.447 に答える