【发布时间】:2011-05-28 00:40:53
【问题描述】:
我已经在“在 Mac 上学习 Objective C”的示例代码中多次看到此运算符弹出。
我相信它是Objective C继承的C语言中的运算符。 我尝试用谷歌搜索 Stack Overflow,但奇怪的是什么都没找到。
有英文名字吗?
【问题讨论】:
标签: objective-c c pointers
我已经在“在 Mac 上学习 Objective C”的示例代码中多次看到此运算符弹出。
我相信它是Objective C继承的C语言中的运算符。 我尝试用谷歌搜索 Stack Overflow,但奇怪的是什么都没找到。
有英文名字吗?
【问题讨论】:
标签: objective-c c pointers
它与结构有关。
当我们在堆栈上本地有一个可用的结构时,我们使用. 运算符访问它的成员。例如:
CGPoint p = CGPointMake(42,42);
NSLog(@"%f", p.x);
但是,如果我们有一个指向结构的指针,我们必须使用-> 运算符:
CGPoint *p = malloc(1*sizeof(CGPoint));
p->x = 42.0f;
NSLog(@"%f", p->x);
free(p);
【讨论】:
(*p).x 代替。
p->x 比(*p).x 更易于阅读。
-> 不是特定于 Objective-C。这是一个 C 运算符。
现在清除了,就是成员访问操作符,相当于一个指针解引用,然后在结果上使用点操作符。
假设你有一个这样的struct:
typedef struct Person {
char *name;
} Person;
Person *jacob = malloc(1*sizeof(Person));
所以这句话:
jacob->name = "Jacob";
相当于这个语句:
(*jacob).name = "Jacob";
当然,别忘了free:
free(jacob);
【讨论】:
在 C 中
a->b
是一个快捷方式
(*a).b
用于解引用指向的结构的成员。
这很有用,因为 .绑定比取消引用运算符 * 更强。所以通过使用 -> 可以避免使用这些丑陋的括号。
【讨论】:
这是一个成员选择(或访问)等价于指针取消引用(如 cmets 中所指出的)
a->member 等价于 C/C++ 中的(*a).member
【讨论】:
*; C99 标准将其称为“成员访问运算符”作为点 (.) (§6.6.9)。我只想说这是(*a).Member 符号的简写。
Property改为member,因为Property在Objective-C中有不同的含义)
The same thing that it means in C。它可用于直接访问对象的实例变量,但通常这不是最佳做法。您所指的点表示法是property,而不是通常的 C 点表示法。
【讨论】:
self->bla(或普通bla)直接访问ivar,而self.bla通过属性访问器访问它。
self.bla 访问实例变量,因为self 是指向内存中对象的指针。这就是为什么你必须使用->。这就是为什么 C 点表示法和 Obj-C 属性之间没有冲突的原因:)
它是“间接成员访问运算符”。它是一个 C 运算符,Objective-C 和 C++ 都继承了它。
这个
a->b
相当于:
(*a).b
但打字较少。 (由于* 和. 的优先级,扩展形式中的括号是必需的。)
【讨论】:
a->b 等价于(*a).b,并指定a 指向的对象的成员b。
在 C 标准中,它被称为“结构/联合指针运算符”,这并不是最吸引人的名字。
【讨论】:
都说了,它是访问结构指针成员的快捷方式,但只是要补充一点,由于 Objective-C 运行时的工作方式,您可以使用相同的语法访问 ivars:
@interface Foo : NSObject {
NSString *something;
}
/* ... SNIP ... */
NSLog(@"something = %@", foo->something); // Where foo is an instance of the Foo class
当您需要访问未通过方法公开的 ivars 时,这很方便;特别是当您需要在对象上实现 copyWithZone: 时。
【讨论】: