Размещение звездочки в Objective-C - PullRequest
53 голосов
/ 09 июля 2009

Я только начал изучать Objective-C, исходя из опыта VB .Net и C # .Net. Я понимаю использование указателя, но в примерах Objective-C я вижу звездочку, размещенную в нескольких разных местах, и ищу, как мог бы, я не смог найти ответ, почему это так. Каждый поиск, который я пытаюсь найти, приводит к всевозможным объяснениям относительно указателей (которые мне действительно не нужны), но ни одного упоминания о причинах / последствиях различных размещений звездочки. Вот несколько примеров, которые я видел:

NSString *string;
NSString * string;
(NSString *) string;
NSString* string;

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

Может кто-нибудь прекратить мои страдания и ответить на этот непонятный вопрос? Спасибо!

Ответы [ 14 ]

32 голосов
/ 05 октября 2009

Нет никакой разницы, однако вы должны знать, что только первый «токен» (так сказать) определяет имя типа, а * не является частью имени типа. То есть:

NSString *aString, bString;

Создает один указатель на NSString и один NSString. Чтобы оба были указателями, выполните одно из следующих действий:

NSString *aString, *bString;

или

NSString *aString;
NSString *bString;
23 голосов
/ 09 июля 2009
1.  NSString *string;
2.  NSString * string;
3.  (NSString *) string;
4.  NSString* string;

1, 2 и 4 абсолютно идентичны. Это все стиль. Выбери, что хочешь, или перепутай.

Вариант №3 также имеет другое значение, он используется в кастинге. Например:

t = (NSString *)string ;

приведёт string к указателю NSString.

Но выбор # 3 - это синтаксис, который вы, вероятно, используете в файле .h или в определении функции в файле .m Внутри фактической функции в коде, который «запускается», она имеет другое значение.

19 голосов
/ 09 июля 2009

Разницы нет - это вопрос стиля. Все они объявляют переменную с именем string, которая является указателем на строку NSString. Скобки необходимы в некоторых контекстах (в частности, объявления методов), чтобы уточнить, что это объявление типа.

6 голосов
/ 09 июля 2009
1.  NSString *string;
2.  NSString * string;
3.  (NSString *) string;
4.  NSString* string;

1,2 и 4 эквивалентны. Язык C (и расширенный набор Objective-C в C) определяют синтаксис, нечувствительный к пробелам. Таким образом, вы можете свободно добавлять пробелы, где вы выбираете, как вопрос стиля. Весь соответствующий синтаксис ограничен непробельными символами (например, {, }, ; и т. Д.) [1].

3 - это либо приведение типа (указание компилятору C использовать тип NSString* независимо от объявленного типа string. В Objective-C приведение типов экземпляров объектов редко требуется. 1009 * тип для переменных, которые могут ссылаться на экземпляры любого типа объекта.

В объявлениях методов синтаксис 3 (иногда без конечной точки с запятой) используется для объявления типа параметров метода. Метод Objective-C может выглядеть так:

- (void)myMethodThatTakesAString:(NSString*)string;

В этом объявлении тип аргумента с именем string имеет тип NSString* (ведущий - указывает метод экземпляра в отличие от метода класса). Объявление метода с более чем одним параметром может выглядеть так:

- (void)myMethodTakingAString:(NSString*)string andAnInteger:(NSInteger)intParam;

[1] По сравнению с такими языками, как Python, в качестве разделителя блоков используются пробелы.

6 голосов
/ 09 июля 2009

не имеет значения, где вы ставите звездочку, все операторы создают указатели типа NSString.

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

NSString * nsstring, * nsstring2;
5 голосов
/ 05 октября 2009

Нет разницы, где *, помещенный в указатель, не имеет значения.

4 голосов
/ 05 октября 2009

Нет абсолютно никакой разницы. NSString * mystring и NSString * myString идентичны.

4 голосов
/ 05 октября 2009

Без разницы, размещение пробелов не имеет значения.

3 голосов
/ 05 октября 2009

* работает так же, как и в стандартном C.

Это хороший учебник по размещению * в разных местах и ​​тому, что он делает: http://boredzo.org/pointers/

3 голосов
/ 05 октября 2009

Между ними нет абсолютно никакой разницы.

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