2011-01-26 27 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分配 並存儲到 'targetString'

這些2個評論是在線路136和137,其中,線136是

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

另一種可能是將該字符串聲明爲

NSString *targetString; 

,並將其設置在每種情況下爲

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

甚至allocing在每種情況下的字符串,以便在年底發佈它...

那麼,會是什麼這裏最好的辦法是?

感謝,

邁克爾:)

回答

5

原因你的內存泄漏是因爲你不必要這一行

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

分配一個字符串,然後將其設置爲一個文本對象。將targetString定義爲nil,因爲當你將它設置爲targetString = @"ONE"之類的其他值時,你不再引用你分配的空字符串,並導致內存泄漏。至於你的方法的開關情況下,確定罰款的價值。

+0

所以我應該只需要聲明它作爲的NSString * targetString,然後將它像targetString = @ 「ONE」? – Smikey 2011-01-26 17:47:29

+0

沒有聲明爲零。`NSString * targetString = nil;`然後在switch語句中將其設置爲文字。當設置爲字符串時,也不需要釋放targetString。 – Joe 2011-01-26 18:20:27

2

我相信這將是不夠的:

NSString *targetString = nil; 

而且你也不需要釋放targetString然後。

0

這個怎麼樣,而不是開關:

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