我正在读一本名为Java和C的书:关键差异,为Java开发人员学习Objective-C。 (我的背景是C#/ Java所以指针和管理内存的概念对我来说是新的,所以请耐心等待我)
在第2章中,它解释了这个例子的指针:
int i = 1;
int *iptr;
iptr = &i;
*iptr = 2;
我理解上面的内容,其中*iptr
是一个指针,它被分配了i
的内存位置,同样来自指针iptr
我们可以访问值iptr
使用*iptr
语法指向。
在本书的下方还有以下片段:
//..
NSMutableString *z = [[[NSNutableString alloc]init] autorelease];
[z appendString:@"Zombie "];
//...
根据我对第2章的理解,行[z appendString:@"Zombie "]
应该是[*z appendString:@"Zombie "]
,因为我们希望实际的NSMutableString
,而不是它的指针,发送消息{{ 1}}!?我知道我错了,有些东西我错过了,请指出正确的方向。
非常感谢,
朱塞佩
答案 0 :(得分:6)
在Objective-C中,总是使用指向对象的指针(不能在堆栈上创建对象)。消息总是传递给指针(尽管这只是一个抽象 - 在运行时级别完成了更复杂的事情)。
答案 1 :(得分:4)
简单的答案是Objective-C语法与普通C语言不同。
是的,Obj-C对象是使用普通的C语法定义的,因为它实际上是一个指向结构的指针,但在处理Objective-C指令时不使用*
运算符。
实际上没有任何东西禁止Objective-C的语义通过其指针向对象发送消息,所以根本不用担心。
在任何情况下,这都适用于每个对象,但有许多typedefs
(例如NSInteger
)包含原始的结构化C类型。它们可以通过直接使用它们在C中使用,或者通过分配它们。
答案 2 :(得分:2)
可能你不知道
NSMutableString *z = [[[NSNutableString alloc]init] autorelease];
是
的简化形式NSMutableString *z;
z = [[[NSNutableString alloc]init] autorelease];
可能现在更清楚了。 正如mipadi所说,在Objective-C中,你总是处理指向对象而不是真实对象的指针(例如有时在C ++中)
答案 3 :(得分:1)
括号表示法[obj message]
表示obj
是指向对象的指针。因此,*
将被表达。