注意:这篇文章去年发表的,而新的Xcode5调整了字符串变量显示方式,之前显示格式是unichar\,现在为NSString*,所以在新版Xcode下已经没有问题了。谢谢网友们的关注。(2014-04-15)*

今天一位同事调试时发现了一个问题:一个字符串在被replace后,调试时并没有被replace。代码如下:

1
2
3
4
NSString *s = @"深圳市";
s = [s stringByReplacingOccurrencesOfString:@"市" withString:@""];
NSLog(@"%@",s);
return YES;

我在最后设置的一个断点,看看运行后的情况:

image

可以看出左侧的s中显示并不是“深圳”,而是“深圳市 ”,貌似并没有替换掉。但右侧Log输出却是深圳。那么究竟那个是对的呢?

其实在系统中NSString对象主要有两个属性:一个unichar(2个字节)数组, 另一个是长度。如果仅仅是把字符串末位的一些字去掉的话,unichar数组的内容并没有修改,而仅仅修改了长度属性。

我们在看看控制台左侧的显示格式,就会更明白了。

image

可以看出实际显示的是unichar*,由于replace后unichar*指针地址并没有改变,变的只是length属性,所以显示也没有变。

结论

有时候我们在看字符串的内容时,特别时仅仅进行了尾部替换为空这些操作时,我们不能仅仅看控制台变量的显示,我们要Print Descripton。