这里我有2个字符串对象
NSString *name1 = @"Julia";
NSString *name2 = @"Julia";
NSLog(@"name1's memory: %p and name2's memory: %p", name1, name2);
这些是2个对象,因为内容完全相同,它会自动指向同一个内存。
这是日志
name1's memory: 0x100002320 and name2's memory: 0x100002320
Java编程语言中也存在同样的行为。
接下来,我使用NSMutableString进行相同的测试。
NSString *name1 = [NSMutableString stringWithString:@"Julia"];
NSString *name2 = [NSMutableString stringWithString:@"Julia"];
NSLog(@"name1's memory: %p and name2's memory: %p", name1, name2);
这是日志
name1's memory: 0x10010a4c0 and name2's memory: 0x10010a550
结果不同。每一个都指向它自己的记忆。
你怎么解释这个? NSString更有效吗?
答案 0 :(得分:1)
在这个人为的例子中,你可以从以下方面获得相同的表现:
NSString *name1 = [NSMutableString stringWithString:@"Julia"];
NSString *name2 = name1;
但是,不可变字符串会尝试通过在可能的情况下指向相同的内存地址来获得更好的性能,显然这对于可变字符串不会发生,因为修改字符串不应该更改指向同一内存的其他任意字符串为了效率。对于大多数情况,可变字符串将更有效,但在这个人为设想的例子中,不可变字符串在内存空间方面会更有效。