Почему я должен писать * myPointerVar только ИНОГДА в Objective-C? - PullRequest
2 голосов
/ 24 февраля 2009

Это проблема, которую я до сих пор не понимаю.

Иногда мне приходится писать:

NSString* myVariable;
myVariable = @"Hey!";

Затем, например, я определяю структуру "DemoStruct" и получаю переменную, которая ее использует. Допустим, у меня есть структура, в которой есть x и y переменные типа double.

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

Я передаю это так:

[someObject someMethod:&myVarThatUsesTheStruct]

этот метод теперь выглядит так:

- (void)someMethod:(DemoStruct*)myVar {
(*myVar).x += 10;
}

Перед вызовом компонент x структуры был, скажем, 1000. Теперь добавляется 10, и это 1010 после вызова метода.

Но я действительно с трудом понимаю, почему я должен использовать звездочку * для myVar в методе, поскольку я уже говорил в заголовке метода, что myVar - это указатель на DemoStruct. Я просто передаю & myVarThatUsesTheStruct адрес памяти.

Может кто-нибудь объяснить, почему это так?

Ответы [ 3 ]

3 голосов
/ 24 февраля 2009

Как вы говорите, myVar - это указатель. Таким образом, myVar.x неверен: это будет поле указателя, которое не имеет смысла в C / Objective-C.

Если вы хотите получить доступ к переменной, на которую указывает указатель, вы должны добавить звездочку: myVar - указатель, *myVar - переменная, на которую указывает myVar.

Более того, в вашем случае вы можете использовать специальную конструкцию C, написав myVar->x, что строго эквивалентно (*myVar).x.

Все это стандарт C, не специфичный для Objective-C.

В вашем первом примере вам не нужно ставить звездочку, потому что вы изменяете значение указателя, а не значение переменной: myVariable - указатель на объект, которому во время объявления присваивается nil значение. Следующая инструкция (myVariable = @"Hey!") - это присвоение значений указателя: @"Hey!" - указатель на объект NSString. Значение этого указателя (не значение указанной константы) присваивается myVariable, который затем указывает на объект @"Hey!".

Да, это трудно для первого раза ...

2 голосов
/ 24 февраля 2009

* - оператор разыменования. * * * * * * * * * * * * * * * * * Все, что означает * myVar, это 'Получите мне то, на что указывает указатель myVar'. Вам нужно это различие, потому что вы должны сказать компьютеру, что вы хотите изменить то, на что указывает myVar, а не сам myVar.

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

взято из учебной цели c ссылкой через портал разработчиков для разработчиков iphone:

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

В следующем примере показана строго и слабо типизированная переменная декларации:

MyClass * myObject1; // Строгий набор

id myObject2; // Слабый набор

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

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