Подтвердить что ты не робот

Размещение звездочки в Objective-C

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

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

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

Может кто-нибудь, пожалуйста, закончит мое несчастье и ответит на этот озадачивающий вопрос? Спасибо!

4b9b3361

Ответ 1

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

NSString *aString, bString;

Создает один указатель на NSString и один NSString. Чтобы оба указателя отображались, выполните либо:

NSString *aString, *bString;

или

NSString *aString;
NSString *bString;

Ответ 2

1.  NSString *string;
2.  NSString * string;
3.  (NSString *) string;
4.  NSString* string;

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

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

t = (NSString *)string ;

отобразит string в указатель NSString.

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

Ответ 3

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

Ответ 4

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

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

NSString * nsstring, * nsstring2;

Ответ 5

1.  NSString *string;
2.  NSString * string;
3.  (NSString *) string;
4.  NSString* string;

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

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

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

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

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

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

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

Ответ 6

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

Ответ 7

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

Ответ 8

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

Ответ 9

на самом деле все эквивалентно: указатель на nsstring!!

Ответ 10

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

Ответ 11

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

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

Ответ 12

1, 2 и 4 эквивалентны и определяют указатель на NSString. Мое личное предпочтение заключается в том, чтобы как можно больше эмулировать K & R, поэтому мне нравится использовать NSString *string;

(NString*)string; хотя и действительный оператор, сам по себе ничего не делает.

$ cat foo.m
#include <Cocoa/Cocoa.h>

void foo()
{
    NSString *string;

    (NSString*) string;  // doesn't do anything
    42;   // doesn't do anything either
}

$ gcc -Wall -c foo.m
foo.m: In function 'foo':
foo.m:7: warning: statement with no effect
foo.m:8: warning: statement with no effect

Ответ 13

в примере кода документации xcode4 вы можете видеть 3. все время, например, в MoveMeView.m

#if 1

- (void)growAnimationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context {

#define MOVE_ANIMATION_DURATION_SECONDS 0.15

[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:MOVE_ANIMATION_DURATION_SECONDS];
placardView.transform = CGAffineTransformMakeScale(1.1f, 1.1f); 
/*
 Move the placardView to under the touch.
 We passed the location wrapped in an NSValue as the context.
 Get the point from the value, then release the value because we retained it in touchesBegan:withEvent:.
 */
NSValue *touchPointValue = (NSValue *)context;
placardView.center = [touchPointValue CGPointValue];
[touchPointValue release];
[UIView commitAnimations];
}

Ответ 14

Не может быть никаких различий в альтернативах 1, 2 и 4 на компьютере, но есть и другие читатели кода.

Так как объяснения вроде fooobar.com/info/103505/... и fooobar.com/info/103521/... и https://www.tutorialspoint.com/objective_c/objective_c_pointers.htm использует первый вариант:

1. NSString *string;

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

NSString *aString, *bString;

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