Swift中NSLog打印特殊转义字符串触发EXC_BAD_ACCESS崩溃原因咨询
为什么直接用NSLog打印含%的URL字符串会触发EXC_BAD_ACCESS崩溃
核心原因是NSLog是C风格的格式化输出函数,它会把第一个参数当作「格式控制字符串」来解析,字符串里的%是占位符标记,而非普通字符。
具体崩溃逻辑:
- 当你执行
NSLog("%3A%2F%2F%2F%2F%2F%3F%3D%2k%3D%2s%3D")时,NSLog会逐段解析字符串中%开头的片段:%3A会被识别为格式占位符的一部分(%3是无效的宽度指定,后续的A也不是合法格式符),但还未触发崩溃;- 致命错误出现在
%2s:这会被解析成「宽度为2的C字符串占位符」,按照NSLog的规则,它会去栈中读取对应的C字符串参数,但你根本没传任何额外参数,直接导致程序访问非法内存地址,触发EXC_BAD_ACCESS崩溃; - 同理,
%2k也是完全无效的格式说明符,同样会让NSLog错误地尝试读取不存在的参数,引发内存异常。
为什么用NSLog("%@", urlStr)就能避免:
当你把%@作为格式串、urlStr作为第二个参数传入时,NSLog会把%@当作「Objective-C/Swift对象占位符」,直接读取传入的urlStr对象并打印其内容——此时urlStr里的%只是普通字符,不会被当作格式占位符解析,自然不会触发崩溃。
内容的提问来源于stack exchange,提问作者SunnyJ_CN
相关产品推荐
相关产品推荐

