2008-12-28 71 views
2

我有时间理解Objective C中的指针。它们的行为并不像我基于各种C教程所假设的那样。Obj C - 理解指针

实施例:

// Define Name and ID 
NSString *processName = [[NSProcessInfo processInfo] processName]; 
NSNumber *processID = [NSNumber numberWithInt:[[NSProcessInfo processInfo] processIdentifier]]; 

// Print Name and ID 
NSLog(@"Process Name: %@ Process Identifier: %@", processName, processID); 

据我所知,processName是指向型的NSString的对象。 processID是一个指向NSNumber类型的对象的指针。当两者都在NSLog()中调用时,它们的名称前面没有星号,因此应该返回指针值。为什么Obj C中没有'地址'字符?为什么此代码有效?

谢谢你的时间。

回答

11

目标c中的对象表示为指向包含所有对象数据的c结构的指针。如果对象是一个实际的结构(而不​​是指向一个的指针),它就会像传递对象一样作为方法参数的效率变得非常低。所以一旦你初始化的对象:

NSString *aString = /* initial value */; 

你几乎永远只是使用指针ASTRING,而不是取消引用它(即* ASTRING)。

NSLog()函数中的%@标记期望指针类型,并将调用该对象的描述方法以确定要输出的值。当在NSString对象上调用描述方法时,它会返回接收者,所以%@标记被输出中字符串的内容替换。

7

格式字符串中的%@告诉NSLog在相关对象上调用-description,并使用该字符串作为其显示值。如果您确实需要指针的地址,则应在64位上使用%x%qx

+0

或者使用%p,它打印指针地址,指针的格式更好。 – mipadi 2008-12-28 02:28:37