问题: 下面的代码会打印什么结果?解释你的答案
NSString *firstUserName = @"nick";
NSString *secondUserName = @"nick";
if (firstUserName == secondUserName) {
NSLog(@"areEqual");
}
else {
NSLog(@"areNotEqual");
}
程序会输出“areEqual”。
看上去好像答案很明显,其实不然。用‘==’比较两个指针相当于检查他们是否指向同一个对象(指针存储的是对象的地址)。两个指针只有指向同一个对象(两个指针存储相同的对象地址)时这两个指针才相等。两个指针指向的两个对象的值相等,但不是同一个对象,那么两个指针还是不相等,所以这么分析上面按理应该输出“areNotEqual”。
上面的代码片中,firstUserName和secondUserName是指向两个不同对象的指针,虽然对象的内容一样。但是iOS编译器对string对象的引用做了优化,也就是对字符串相同的对象做了重用而不是分别分配空间,所以虽然上面代码是两个指针分别定义的,但实际还是指向了同一个字符串对象,导致两个指针相等了。
OC中等同性扩展:
== 是只比较两个指针地址,那么另外isEqual 和 isEqualToString有什么不同呢?
isEqual是比较两个NSObject的方法,而isEqualToString是比较两个NSString的方法,明显isEqualToString只是专门用来比较字符串的,是isEqual的衍生方法。
isEqual首先是比较两个指针地址,如果地址相同则直接返回YES;如果地址不同再看两个指针指向的对象是否为空以及对象类型是否相同,如果有一个为空或者两者不是同类对象则直接返回NO;如果都不为空且属于同类对象则返回YES。
因此,对于题中两个指针,三种判断方法都会判定两者相等。
问题:下面的代码会打印什么结果?
NSString *str = @"a123";
NSLog(@"%@", (str == @"a123") ? @"yes" : @"no");
这里打印结果为no。这里字符串str和临时的相同内容的字符串比较,‘==’比较的是它们的指针,这样的写法临时的@“a123”是一个新的字符串,虽然字符串内容相同,但是没有被编译器优化,因此和str不是同一个字符串,地址不同。
问题:下面那个方法可以比较两个NSString *str1, *str2的异同:
if(str1 = str2) xxx;
if([str1 isEqualToString:str2]) xxx;(right)
if(str1 && str2) xxx;
if([str1 length] == [str2 length]) xxx;
网友评论