В 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
. Когда вы отправляете сообщения указателю на объект, указатель неявно разыменовывается.