1

これは、不要な文字列とダブルスペースをクリーニングするために作成したコードです。しかし、どこかでメモリ管理を誤解しているようで、EXC_BAD_ACCESSエラーが発生し続けています。リリースステートメントが削除されると、コードは機能的に正常に機能しますが、メモリリークが発生する可能性があります。

-(NSString*) cleaningString:(NSString*) input  {
NSCharacterSet* wantedCharacters=[[NSCharacterSet alloc] init];

   wantedCharacters=[ NSCharacterSet    
 characterSetWithCharactersInString:@"qwertyuiopasdfghjklzxcvbnm"];


NSString* cleanStringOutput=[[NSString alloc] initWithString:@""];
NSString* currentLetter =[[NSString alloc] initWithString:@" "];
NSRange unwantedCharacters=[currentLetter rangeOfCharacterFromSet:wantedCharacters];

for (int i=0; i<input.length; i++) {
    currentLetter=[NSString stringWithFormat:@"%c",[input characterAtIndex:i]];
    unwantedCharacters=[currentLetter rangeOfCharacterFromSet:wantedCharacters];
    doubleSpace=YES;
    if (i<input.length-1) {
        if (([currentLetter isEqualToString:@" "])&&([[NSString stringWithFormat:@"%c",[input characterAtIndex:i+1]] isEqualToString:@" "])) {
            doubleSpace=NO;}
    }
    else {
        if ([currentLetter isEqualToString:@" "]) {
            doubleSpace=NO;
        }
    }
    if ((unwantedCharacters.location!=NSNotFound)&&(doubleSpace))
    {
        cleanStringOutput=[NSString stringWithFormat:@"%@%@", cleanStringOutput, currentLetter];
    }
}
if (cleanStringOutput.length>0){
    if ([[NSString stringWithFormat:@"%c",[cleanStringOutput characterAtIndex:0]] isEqualToString:@" "]){
        cleanStringOutput=[cleanStringOutput substringFromIndex:1];
    }
}

[currentLetter release];
[wantedCharacters release];
[cleanStringOutput autorelease];
return cleanStringOutput;
}

痛々しいほど明白なことを聞​​いたら、許してください。

PSそして別の質問。NSRangeを解放する必要がありますか?

4

4 に答える 4

1

ここです

NSCharacterSet* wantedCharacters=[[NSCharacterSet alloc] init];

   wantedCharacters=[ NSCharacterSet    
 characterSetWithCharactersInString:@"qwertyuiopasdfghjklzxcvbnm"];

元のオブジェクトを破棄して、自動リリースされたオブジェクトに置き換えます

電話をかけるとクラッシュします

[wantedCharacters release];

これを行う

NSCharacterSet* wantedCharacters=[ NSCharacterSet    
 characterSetWithCharactersInString:@"qwertyuiopasdfghjklzxcvbnm"];

そして最後を忘れて

[wantedCharacters release];
于 2012-05-02T21:04:46.073 に答える
0

割り当てられたオブジェクトへの参照を失う原因となるコードのいくつかの間違いがあり、例が続きますが、いくつかのことがあります。

  1. それらすべての最も簡単な解決策は、autorelease呼び出した場所で使用することです(そして、それらのオブジェクトallocのを削除します)。次に例を示します。release

    NSString* cleanStringOutput=[[[NSString alloc] initWithString:@""] autorelease];
    
  2. 後で割り当てるためだけに変数を作成する場合、次に割り当てる必要はありません。

    NSCharacterSet* wantedCharacters; // no need for alloc here
    wantedCharacters=[ NSCharacterSet characterSetWithCharactersInString:@"qwertyuiopasdfghjklzxcvbnm"];
    
  3. 一般的に、オブジェクトを割り当てなかった場合は、解放しません。

于 2012-05-02T21:02:12.723 に答える
0
currentLetter=[NSString stringWithFormat:@"%c",[input characterAtIndex:i]];

自動解放された文字列を返します-上記で割り当て/初期化する必要はありません。

NSString* currentLetter =[[NSString alloc] initWithString:@" "];

だから

[currentLetter release];

おそらく問題を引き起こすでしょう。

于 2012-05-02T21:02:16.710 に答える
0

オブジェクトを割り当て/初期wantedCharacters化してから、便利な関数を使用してオブジェクトを再割り当てします。再割り当てにより、最初のオブジェクトでゾンビが作成されます。

便利な関数は、新しいオブジェクトインスタンスを自動解放プールに入れます。

次に、リリースを呼び出します。一度だけ保持されたため、割り当てが解除されます。

後で、自動解放プールはその上でreleaseを呼び出しますが、すでに割り当てが解除されています。これによりクラッシュが発生します。

于 2012-05-02T21:18:32.303 に答える