2011-01-26 12 views
0

警告内で使用するNSStringオブジェクトを宣言したいが、その実際の内容はいくつかの変数によって決まるさまざまな要因に依存する。私はこれに最も近づける方法が不思議です。私はこのような何かやったほとんどの場合:私は、ビルド・アナライザを介してこれを実行すると複数の可能な値を持つNSStringを宣言する方法

- (void)info { 
    NSString *targetString = [[NSString alloc] init]; 
    switch (self.target) { 
     case 1: 
      targetString = @"ONE"; 
      break; 
     case 2: 
      targetString = @"TWO"; 
      break; 
     case 3: 
      targetString = @"THREE"; 
      break; 
     default: 
      targetString = @""; 
      break; 
    } 

NSString *message = [[NSString alloc] initWithFormat:@"Text: %@", targetString]; 
    UIAlertView *alert = [[UIAlertView alloc] 
          initWithTitle:@"Info" 
          message:message 
          delegate:self 
          cancelButtonTitle:@"Ok!" 
          otherButtonTitles:nil]; 
    alert.tag = kInfoAlert; 
    [alert show]; 
    [alert release]; 
    [targetString release]; 
    [message release]; 
} 

をしかし、私は、文字列がメモリをリークしている私に告げるメッセージが出ます:すべての

まずそれは言う:

中の 'targetString' に保存され

値は、その初期化が

次に読まれることはありません:

オブジェクトの潜在的な漏れは、ライン137上 を割り当てられ に格納されたライン136は

NSString *targetString = [[NSString alloc] init];

ある 'targetString'

これら2つのコメントは、ライン136と137であります

代わりに、文字列を

のように宣言することがあります。
NSString *targetString; 
どうなるか

となど

、あるいは最後にそれを解放するために、それぞれの場合の文字列をallocing

targetString = [NSString stringWithFormat:@"ONE"]; 

として、それぞれの場合に、それを設定し...まあ

、ここに最善のアプローチ?

おかげで、

マイケル:)

答えて

5

あなたは不このライン

NSString *targetString = [[NSString alloc] init]; 

で文字列を割り当て、その後、オブジェクトリテラルにそれを設定しているので、あなたのメモリリークの理由があります。 targetString = @"ONE"のような別の値に設定すると、割り当てられた空の文字列を参照しなくなり、メモリリークが発生するため、targetStringをnilとして定義します。あなたのスイッチの場合、値が正しいかどうかを判断する方法については問題ありません。

+0

だから、僕はNSStringの* targetStringとしてそれを宣言した後、targetString = @ "ONE" のようにそれを設定する必要がありますか? – Smikey

+0

いいえとして宣言してください。'NSString * targetString = nil;'そしてそれをswitchステートメントのリテラルに設定します。また、文字列に設定するときにtargetStringを解放する必要はありません。 – Joe

+0

設定している文字列が単純なリテラルでない場合、つまり[[NSString alloc] initWithFormat:@ "Some text plus%@"、someString]のような宣言が必要です。それから私は記憶を割り当てています。私は代わりに便利な方法を使うべきですか? – Smikey

2

私は、これは十分だろうと信じて:

NSString *targetString = nil; 

そして、あなたはその後targetStringを解放する必要はありません。

0

どのスイッチの代わりに、このことについて:

- (NSString*) stringForIndex: (NSUInteger) index 
{ 
    NSParameterAssert(index < 4); 
    id strings[] = {@"none", @"one", @"two", @"three"}; 
    return strings[index]; 
} 
+0

このケースははいですが、もっと一般的なケースを説明するために使用していました。しかし、ありがとう。 – Smikey

関連する問題