В чем разница между '->' (оператор стрелки) и '.' (оператор точки) в Objective-C?

В Objective-C в чем разница между доступом к переменной в классе с помощью -> (оператор стрелки) и . (оператор точки)? Используется ли -> для прямого доступа к точке (.)?

Ответ 1

-> является традиционным оператором C для доступа к члену структуры, на которую ссылается указатель. Поскольку Objective-C объекты обычно используются в качестве указателей, а класс Objective-C - это структура, вы можете использовать -> для доступа к своим членам, которые (как правило) соответствуют переменным экземпляра. Обратите внимание: если вы пытаетесь получить доступ к переменной экземпляра вне класса, тогда переменная экземпляра должна быть помечена как общедоступная.

Итак, например:

SomeClass *obj = …;
NSLog(@"name = %@", obj->name);
obj->name = @"Jim";

обращается к переменной экземпляра name, объявленной в SomeClass (или одном из ее суперклассов), соответствующем объекту obj.

С другой стороны, . используется (обычно) как синтаксис dot > для методов getter и setter . Например:

SomeClass *obj = …;
NSLog(@"name = %@", obj.name);

эквивалентен использованию метода геттера name:

SomeClass *obj = …;
NSLog(@"name = %@", [obj name]);

Если name является объявленным свойством, его можно присвоить его методу getter другому имени.

Точечный синтаксис также используется для методов setter. Например:

SomeClass *obj = …;
obj.name = @"Jim";

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

SomeClass *obj = …;
[obj setName:@"Jim"];

Ответ 2

Стрелка, ->, является сокращением для точки в сочетании с разыменованием указателя, эти два являются одинаковыми для некоторого указателя p:

p->m
(*p).m

Обозначение стрелки наследуется от C и C имеет его, потому что оператор доступа к члену структуры (.) связывается слабее, чем оператор разыменования указателя (*), и никто не хочет писать (*p).m все время и они хотят изменить приоритет оператора, чтобы люди пишут *(p.m) для разыменования указателя внутри структуры. Итак, стрелка была добавлена, чтобы вы могли сделать как p->m, так и *s.p разумно без уродства круглых скобок.

Ответ 3

Когда вы используете оператор стрелки ptr->member, он неявно разыгрывает этот указатель. Это эквивалентно (*ptr).member. Когда вы отправляете сообщения указателю на объект, указатель неявно разыменовывается.