Что такое "->" в Objective C?

Я видел, как этот оператор несколько раз появлялся в примере кода в "Learn Objective C на Mac".

Я считаю это оператором на языке C, который наследует Objective C. Я попробовал Googling и искал Stack Overflow, и, как ни странно, ничего не получилось.

Есть ли у него английское имя?

Ответ 1

Он связан со структурами.

Когда у нас есть структура, доступная локально в стеке, мы обращаемся к ее членам с оператором .. Например:

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);

Ответ 2

-> не для 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); 

Ответ 3

В C

a->b

является ярлыком для

(*a).b

который предназначен для разыменования элементов структуры, на которые указывает.

Это полезно, из-за. привязывается сильнее, чем оператор разыменования *. Поэтому, используя → , вы избегаете использования этих уродливых скобок.

Ответ 4

Это выбор члена (или доступ), эквивалентный де-ссылке указателя (как указано в комментариях)

a->member эквивалентен (*a).member в C/С++

Ответ 5

То же самое, что и в C. Его можно использовать для непосредственного доступа к переменным экземпляра объектов, но в целом это не лучшая практика. Точечное обозначение, которое вы имеете в виду, это property, а не обычная нотация C.

Ответ 6

a->b эквивалентен (*a).b и обозначает элемент b объекта, на который указывает a.

В стандарте C он называется оператором указателя структуры/объединения, который на самом деле не является самым запоминающимся именем.

Ответ 7

Это оператор косвенного доступа к члену. Это оператор C, который как Objective-C, так и С++ унаследовал.

Это

a->b

эквивалентно:

(*a).b

но меньше печатает. (Парны необходимы в расширенной форме из-за приоритета * и ..)

Ответ 8

Было сказано, что это ярлык для доступа к элементам указателя структуры, но просто примечание для добавления, что вы можете получить доступ к ivars с использованием того же синтаксиса из-за того, как работает среда выполнения Objective-C:

@interface Foo : NSObject {
   NSString *something;
}

/* ... SNIP ... */

NSLog(@"something = %@", foo->something); // Where foo is an instance of the Foo class

Это удобно, когда вам нужно получить доступ к ivars, которые не отображаются методами; особенно когда вам нужно реализовать copyWithZone: на ваших объектах.