objective c NSString比较

问题描述:

我有三个按钮命名(标题)你好,没有,天堂和一个标签(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; 

的问题是,在各种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"]要简单得多。

不要使用按钮的标题您的按钮之间进行区分。如果你的按钮被本地化,它将无法工作。要么使用不同的操作,要么使用标签来区分它们。

警告是您在这种情况下做错的线索。一个局部变量只在它声明的范围内可见,所以你的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;