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
的变量。您的新定义str
为shadowing旧的:虽然新名称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;