1

リークを回避してNSMutableStringによって構築された文字列を返す良い方法を探しています:

例えば:

+(NSString *)myMethod{



 NSMutableString *numberToReturn = [[NSMutableString alloc] init];
 [numberToReturn appendString:@"lorem ipsum"];


 return numberToReturn;
}

リーク機器は、この変数でリークが発生したと述べました。

自動リリースを試しましたが、クラッシュします。コピーを返すか、可変文字列をnsstringにコピーしようとしましたが、リークがまだ存在します。

何かアイデアやトリックはありますか?ユーザーがテキストフィールドに値を入力するたびにこのメソッドを呼び出す必要があるため、メモリ管理が不適切なためにアプリケーションがクラッシュします...

ありがとうございました

4

2 に答える 2

12

を使用する必要があります-autorelease。メソッドは次のように記述します。

+ (NSString*)myMethod {
    NSMutableString *stringToReturn = [[NSMutableString alloc] init];
    [stringToReturn appendString:@"lorem ipsum"];

   return [stringToReturn autorelease];
}

クラッシュが発生した場合、障害は別の場所にあります。

もちろん、メソッドを次のように書き換えて、すでに自動解放されたインスタンスを返すファクトリ メソッドを利用できます。

+ (NSString*)myMethod {
  NSMutableString *result = [NSMutableString string];
  [result appendString:@"lorem ipsum"];

  return result;
}

または、あなたの例ではなおさらです。

+ (NSString*)myMethod {
    NSMutableString *result = [NSMutableString stringWithString:@"lorem ipsum"];
    //...do something with result;
    return result;
}

明らかに、メソッドの唯一の目的が文字列を含む新しい文字列を返すことだけである場合は、メソッド全体をまとめて回避し[NSMutableString stringWithString:@"lorem ipsum"]、変更可能な文字列が本当に必要な場合に使用できます。

于 2009-12-02T21:11:33.877 に答える
4

文字列を返す前に自動解放する必要があります。それが、メモリ管理ルールが行うように指示していることです。その後アプリがクラッシュした場合、それはコードの別の場所にバグがあることを示しています。

于 2009-12-02T21:13:04.797 に答える