If-Then语句混乱,NSURL结果不能正常工作

时间:2011-05-19 02:39:59

标签: iphone ios string-comparison

我想做的是采用预定义的[self getYear]方法并以一年(即1995)的形式返回NSString,然后取出该数字并将其匹配到实际的年份,并将其设置为URL变量theClassyear。当这个项目运行时,我将它作为-viewWillAppear中的设置方法的一部分,当我拉出视图时(这是在标签栏控制器fyi中)然后我得到NSURL错误101或错误-999。 [self getYear]方法从NSUserDefaults字符串获取字符串,该字符串由UIPicker在控制器推送的不同视图中设置。就像我说的那样,当我第一次打开视图并且这个方法运行时,我从第一个NSLog获得了正确的结果,但随后它运行我的if语句并最终使用else语句设置我应该返回的NSURL null(根据我的NSLog)。稍后在代码中我有另一个NSLog再次打印[self getYear]结果,这也给了我正确的数字。不知怎的,我的if-then逻辑没有正确运行,我会喜欢我可能做错的建议。提前致谢!!! :)

-(NSURL *)theClassYear{

NSURL *theClassYear = [[NSURL alloc] init];
NSLog(@"the user default loaded for the year is: %@",[self getYear]);

if ([self getYear] == @"1995") {
    theClassYear = [NSURL URLWithString:@"http://www.facebook.com/group.php?gid=35443264449"];
}
else if ([self getYear] == @"1996"){
    theClassYear = [NSURL URLWithString:@"http://www.facebook.com/group.php?gid=50371222704"];
}
else if ([self getYear] == @"1997"){
    theClassYear = [NSURL URLWithString:@"http://www.facebook.com/group.php?gid=101880069858690"];
}
else if ([self getYear] == @"1998"){
    theClassYear = [NSURL URLWithString:@"http://www.facebook.com/group.php?gid=98761155252"];
}
else if ([self getYear] == @"1999"){
    theClassYear = [NSURL URLWithString:@"http://www.facebook.com/group.php?gid=34955119113"];
}
else if ([self getYear] == @"2000"){
    theClassYear = [NSURL URLWithString:@"http://www.facebook.com/group.php?gid=41438241821"];
}
else if ([self getYear] == @"2001"){
    theClassYear = [NSURL URLWithString:@"http://www.facebook.com/group.php?gid=44108047608"];
}
else if ([self getYear] == @"2002"){
    theClassYear = [NSURL URLWithString:@"http://www.facebook.com/group.php?gid=98700780436"];
}
else if ([self getYear] == @"2003"){
    theClassYear = [NSURL URLWithString:@"http://www.facebook.com/group.php?gid=36811255052"];
}
else if ([self getYear] == @"2004"){
    theClassYear = [NSURL URLWithString:@"http://www.facebook.com/group.php?gid=40331531709"];
}
else if ([self getYear] == @"2005"){
    theClassYear = [NSURL URLWithString:@"http://www.facebook.com/group.php?gid=97724430117"];
}
else if ([self getYear] == @"2006"){
    theClassYear = [NSURL URLWithString:@"http://www.facebook.com/group.php?gid=50868469971"];
}
else if ([self getYear] == @"2007"){
    theClassYear = [NSURL URLWithString:@"http://www.facebook.com/group.php?gid=38506528654"];
}
else if ([self getYear] == @"2008"){
    theClassYear = [NSURL URLWithString:@"http://www.facebook.com/group.php?gid=55466866222"];
}
else if ([self getYear] == @"2009"){
    theClassYear = [NSURL URLWithString:@"http://www.facebook.com/group.php?gid=105187085612"];
}
else if ([self getYear] == @"2010"){
    theClassYear = [NSURL URLWithString:@"http://www.facebook.com/group.php?gid=39303927757"];
}
else if ([self getYear] == @"2011"){
    theClassYear = [NSURL URLWithString:@"http://www.facebook.com/group.php?gid=281837582821"];
}
else if ([self getYear] == @"2012"){
    theClassYear = [NSURL URLWithString:@"http://www.facebook.com/group.php?gid=79162636609"];
}
else if ([self getYear] == @"2013"){
theClassYear = [NSURL URLWithString:@"http://www.facebook.com/home.php?sk=group_161338720557447"];
}
else if ([self getYear] == @"2014"){
    theClassYear = [NSURL URLWithString:@"http://www.facebook.com/home.php?sk=group_125352334187406"];
}
else {
    NSLog(@"no matches");
}    

NSLog(@"the url for the year you chose is: %@",theClassYear);

return theClassYear;
[theClassYear release];

}

2 个答案:

答案 0 :(得分:2)

更多关于我上面的评论

将这些数据放入plist中,抓住plist(在这种情况下将是一个名为dict的NSDictionary)然后return [NSURL URLWithString:[dict objectForKey:[self getYear]]];

答案 1 :(得分:1)

在Objective-C中对==之类的对象使用NSString时,您不是要比较对象的,而是比较对象的内存地址。 *如果你有两个字符串,并且想要查看它们的内容是否相同,你必须像Mahesh所提到的那样使用isEqualToString:来进行正确的比较。

您的代码中还有其他一些可以改进的东西。首先,您正在泄漏NSURL。您首先使用

创建一个
NSURL *theClassYear = [[NSURL alloc] init];

然后你忽略它并在你的if:

的一个分支中创建另一个
theClassYear = [NSURL URLWithString:@"http://www.facebook.com/group.php?gid=35443264449"];
// This creates a new NSURL instance and leaks the old one.

要解决此问题,只需删除初始分配并将其作为声明:

NSURL * theClassYear;   // You will assign to this name later, in a branch

接下来,正如Mahesh所指出的那样,一旦你在一个方法中说return,就没有任何超过该行的内容被执行,所以你的[theClassYear release]不会发生。在这种情况下,它实际上也是不必要的。**从URLWithString:返回的对象是自动释放的,在这种情况下正是你想要的。

最后,请接受Rexeisen关于将所有这些字符串放入字典的建议。它将使您的代码更易于阅读和更易于维护。


*与Python,Perl或PHP等解释性语言或带有运算符重载的编译语言(如C ++)不同。 **事实上,如果它正在运行,它会因过度释放而导致崩溃。