Objective c gdb中的nil未定义为0x0?

Objective c gdb中的nil未定义为0x0?,objective-c,gdb,null,Objective C,Gdb,Null,我正在用gdb(Xcode的内部)逐步浏览一些简单的Objective-C代码,发现了一些奇怪的东西。以下是相关片段: NSString *s = nil; int x = (s == nil); 正如我所期望的,这两行后面的x的值是1。奇怪的是,如果我在gdb中尝试类似的东西,它的效果就不一样了: (gdb) print ret $1 = (NSString *) 0x0 (gdb) print (int)(ret==nil) $2 = 0 (gdb) print nil $3 = {<

我正在用gdb(Xcode的内部)逐步浏览一些简单的Objective-C代码,发现了一些奇怪的东西。以下是相关片段:

NSString *s = nil;
int x = (s == nil);
正如我所期望的,这两行后面的
x
的值是
1
。奇怪的是,如果我在gdb中尝试类似的东西,它的效果就不一样了:

(gdb) print ret
$1 = (NSString *) 0x0
(gdb) print (int)(ret==nil)
$2 = 0
(gdb) print nil
$3 = {<text variable, no debug info>} 0x167d18 <nil>
(gdb)打印ret
$1=(NSString*)0x0
(gdb)打印(int)(ret==nil)
$2 = 0
(gdb)打印无
$3={}0x167d18

gdb似乎对nil有一些定义,而不是objective-C使用的定义(0x0)。有人能解释一下这里发生了什么吗?

它指向内存中的地址,而不是变量内容。

在编译代码时,
nil
是一个预处理器常量,定义为
\uu null
(一个充当
null
的特殊GCC变量)、
0L
0

<objc/objc.h>
#ifndef nil
#define nil __DARWIN_NULL /* id of Nil instance */
#endif

<sys/_types.h>
#ifdef __cplusplus
#ifdef __GNUG__
#define __DARWIN_NULL __null
#else /* ! __GNUG__ */
#ifdef __LP64__
#define __DARWIN_NULL (0L)
#else /* !__LP64__ */
#define __DARWIN_NULL 0
#endif /* __LP64__ */
#endif /* __GNUG__ */
#else /* ! __cplusplus */
#define __DARWIN_NULL ((void *)0)
#endif /* __cplusplus */
(gdb) p *(long *)nil
$2 = 0
(gdb) x/xg nil
0x20c49ba5da6428 <nil>: 0x0000000000000000
毫不奇怪,它的值竟然是
0

<objc/objc.h>
#ifndef nil
#define nil __DARWIN_NULL /* id of Nil instance */
#endif

<sys/_types.h>
#ifdef __cplusplus
#ifdef __GNUG__
#define __DARWIN_NULL __null
#else /* ! __GNUG__ */
#ifdef __LP64__
#define __DARWIN_NULL (0L)
#else /* !__LP64__ */
#define __DARWIN_NULL 0
#endif /* __LP64__ */
#endif /* __GNUG__ */
#else /* ! __cplusplus */
#define __DARWIN_NULL ((void *)0)
#endif /* __cplusplus */
(gdb) p *(long *)nil
$2 = 0
(gdb) x/xg nil
0x20c49ba5da6428 <nil>: 0x0000000000000000
当我们检查基础中定义的符号时,我们发现<代码> nIL/COD>:

$ nm -m /System/Library/Frameworks/Foundation.framework/Foundation | grep nil$
00000000001f4428 (__TEXT,__const) external _nil