前言
- isEqualToString以及==是在OC中比较让人疑惑的一环
- 发现网上很多博客其实都在互相拷贝,错误的回答一遍一遍被重复下去
- 所以我也说不上什么深奥的见解,但我全部使用编译器打印来说明
结论
- 先说毋庸置疑的结论:isEqualToString方法比较的是内容,==比较的是地址
打印比较
代码
NSString *a = [NSString stringWithFormat:@"123"];
NSString *b = [NSString stringWithFormat:@"123"];
NSString *c = @"123";
NSString *d = @"123";
NSLog(@"a:%@", a);
NSLog(@"b:%@", b);
NSLog(@"c:%@", c);
NSLog(@"d:%@", d);
NSLog(@"\nNSString *a:%p\nNSString *b:%p\nNSString *c:%p\nNSString *d:%p", a, b, c, d);
NSLog(@"a:c %d %d", (a == c), [a isEqualToString:c]);
NSLog(@"a:b %d %d", (a == b), [a isEqualToString:b]);
NSLog(@"c:d %d %d", (c == d), [c isEqualToString:d]);
打印结果
a:123
b:123
c:123
d:123
NSString *a:0xa8fc548c5c77fe05
NSString *b:0xa8fc548c5c77fe05
NSString *c:0x100001068
NSString *d:0x100001068
a:c 0 1
a:b 1 1
c:d 1 1
思考
- 我们没办法弄出一个地址一样,内容不一样的来比较,所以也没办法反面验证
- 而NSString *a = [NSString stringWithFormat:@“123”];以及NSString *c = @“123”;一个是通过方法创建,一个是通过常量来创建
- 而这两种方式使用内存的地方是不一样,所以根据比较可以得出结论
- 深入探究可以百度下常量池
- 而很多地方认为a b用==比较是不相等的,然而事实证明两者是相等的,地址也是一样的