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

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

13 голосов
/ 20 декабря 2010

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

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

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

Ответы [ 8 ]

10 голосов
/ 20 декабря 2010

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

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

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);
10 голосов
/ 20 декабря 2010

-> - это , а не , специфичное для 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); 
9 голосов
/ 20 декабря 2010

В C

a->b

- это сокращение для

(*a).b

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

5 голосов
/ 20 декабря 2010

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

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

4 голосов
/ 20 августа 2011

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

2 голосов
/ 20 декабря 2010

Как уже было сказано, это ярлык для доступа к элементам указателя структуры, но просто примечание, добавляющее, что вы можете обращаться к иварам с использованием того же синтаксиса благодаря тому, как работает среда выполнения Objective C:1002 *

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

2 голосов
/ 20 декабря 2010

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

Этот

a->b

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

(*a).b

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

2 голосов
/ 20 декабря 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...