我很难理解目标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中没有'地址'字符?为什么这段代码有效?
感谢您的时间。
答案 0 :(得分:11)
目标c中的对象表示为包含所有对象数据的c结构的指针。如果对象是一个实际的结构(而不是指向一个的指针),那么将对象作为方法参数传递效率要低得多。所以一旦你初始化一个对象:
NSString *aString = /* initial value */;
你几乎总是只使用指针aString,而不是取消引用它(即* aString)。
NSLog()函数中的%@标记需要指针类型,并将在该对象上调用description方法以确定要输出的值。当在NSString对象上调用description方法时,它返回接收者,因此%@ token被输出中字符串的内容替换。
答案 1 :(得分:7)
格式字符串中的%@
告诉NSLog
在相关对象上调用-description
并使用该字符串作为其显示值。如果你想要指针的地址,你应该在64位上使用%x
或%qx
。