В чем разница между «->» (оператор стрелки) и «.» (оператор точки) в Objective-C? - PullRequest
19 голосов
/ 09 июля 2011

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

Ответы [ 3 ]

21 голосов
/ 09 июля 2011

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

Так, например:

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

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

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

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

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

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

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

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

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

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

SomeClass *obj = …;
[obj setName:@"Jim"];
9 голосов
/ 09 июля 2011

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

p->m
(*p).m

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

0 голосов
/ 09 июля 2011

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

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