2009-09-09 80 views
2

我有三個按鈕命名(標題)你好,沒有,天堂和一個標籤(IBOutlet UIlabel實驗室)。我想爲三個差異按鈕點擊顯示三個差異消息。但是下面的代碼沒有完成這個。任何人都可以提出任何想法objective c NSString比較

-(IBAction)buttonclick:(id)sender 
{ 

    NSString *title=[sender titleForState:UIControlStateNormal]; 

    if([title isEqualToString:@"hello"]) 
    { 

     NSString *str=[[NSString alloc] initWithFormat:@"abc"]; 
    } 
    else if([title isEqualToString:@"nothing"]) { 

     NSString *str=[[NSString alloc] initWithFormat:@"def"]; 
    } 
    else if([title isEqualToString:@"heaven"]) 
    { 

     NSString *str=[[NSString alloc] initWithFormat:@"ijk"]; 
    } 

    lab.text=str; 
    [str release]; 
} 

輸出:

warning:unused variable str; 

回答

3

的問題是,在各種if報表的每個「然後」條款,你要創建一個名爲str一個新的局部變量,將其分配給一個新的字符串,然後該變量超出範圍。編譯器警告應該讓你知道這一點:你正在寫一個變量,但從來沒有讀取它。

通常情況下,您的代碼不會編譯,但您顯然在後面的範圍中有另一個名爲str的變量。您的新定義strshadowing舊的:雖然新名稱str在範圍內,但名稱str指的是該變量,而不是外部變量,而外部變量不能被引用。

解決方法是將str的聲明移至該函數的頂部。此外,使用[NSString stringWithFormat:@"blah"]而不是[[NSString alloc] initWithFormat:@"blah"]更簡單,因爲前者會爲您提供自動釋放對象。這可以讓您不必以後再手動輸入release。請注意,分配lab.text=str會保留它,因爲UILabel類的text屬性具有retain修改器。

-(IBAction)buttonclick:(id)sender 
{ 
    NSString *title=[sender titleForState:UIControlStateNormal]; 
    NSString *str; 

    if([title isEqualToString:@"hello"]) 
    { 
     str=[NSString stringWithFormat:@"abc"]; 
    } 
    else if([title isEqualToString:@"nothing"]) 
    { 
     str=[NSString stringWithFormat:@"def"]; 
    } 
    else if([title isEqualToString:@"heaven"]) 
    { 
     str=[NSString stringWithFormat:@"ijk"]; 
    } 

    lab.text=str; 
} 

另外請注意,與原有的代碼,你有兩個內存泄漏和內存損壞 - 因爲你分配一個字符串,然後失去了對它的引用(由新的局部變量str走出去的範圍)而不會釋放它,然後您無論外部str變量是多少時間都要撥打release。將str聲明移至該函數的頂部可以解決這兩個問題。

我還假設你的格式字符串比純粹的字符串更復雜。如果你實際上分配了諸如​​之類的常量字符串,那麼當然要做[email protected]"abc"而不是str=[NSString stringWithFormat:@"abc"]要簡單得多。

5

不要使用按鈕的標題您的按鈕之間進行區分。如果你的按鈕被本地化,它將無法工作。要麼使用不同的操作,要麼使用標籤來區分它們。

警告是您在這種情況下做錯的線索。一個局部變量只在它聲明的範圍內可見,所以你的lab.text = str行實際上是將lab.text設置爲一個在別處定義的str,它是一個靜態變量或一個實例變量。這裏是你能做什麼,而不是:

NSString *str; 

switch ([sender tag]) { 
    case FirstButtonTag: 
    str = @"abc"; 
    break; 
    case SecondButtonTag: 
    str = @"def"; 
    break; 
    case ThirdButtonTag: 
    str = @"ijk"; 
    break; 
} 

lab.text = str;