我在gdb中测试了这个表达式:
(gdb) p (int)[@"-1" floatValue]
$2 = 1
但
(gdb) p (int)((float)[@"-1" floatValue])
$7 = -1
按照我的预期出现
为什么第一个表达式不返回-1
?另外,[@"-1" floatValue]
的返回类型是什么?
答案 0 :(得分:6)
gdb不知道方法(或函数)的返回类型:
(gdb) p [@"-1" floatValue]
Unable to call function "objc_msgSend" at 0x155d08c: no return type information available.
To call this function anyway, you can cast the return type explicitly (e.g. 'print (float) fabs (3.0)')
将表达式强制转换为int
时,gdb会假定该方法返回int
。因此,它知道可以使用objc_msgSend
发送邮件,并将objc_msgSend
的返回值视为int
。
将表达式强制转换为float
时,gdb会假定该方法返回float
。所以它知道它应该使用objc_msgSend_fpret
来发送消息并将返回值视为浮点数。
这很重要,因为:
在i386平台上,ABI函数返回一个浮点数 value与返回积分的函数不兼容 类型。因此,在i386平台上,必须使用objc_msgSend_fpret 对于函数[sic]返回非整数类型的函数。