Obj C - 理解指针

时间:2008-12-28 01:52:28

标签: objective-c oop

我很难理解目标C中的指针。他们的行为并不像我根据各种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中没有'地址'字符?为什么这段代码有效?

感谢您的时间。

2 个答案:

答案 0 :(得分:11)

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

NSString *aString = /* initial value */;

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

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

答案 1 :(得分:7)

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