2013-12-18 2 views
1
NSHost *instance = [NSHost currentHost]; 
NSString *answer = [instance localizedName]; 
NSLog(@"%@",answer); 

Хорошо, я знаю основы указателя, но у меня есть некоторые сомнения в этой 3-строчной строке. После публикации аналогичного вопроса на этом веб-сайте, все же ответ, который я получил, на самом деле не отвечает на мой вопрос. Итак, в первую очередь, Я знаю, что указатель должен содержать адрес. Но почему бы нам не сделать что-то подобное? NSHost * экземпляр = & [NSHost currentHost]; добавлено &. Это потому, что только & показывает адрес чего-то.Назначение указателя в Objective C или C

второй вопрос, что делает [NSHost currentHost] возвращение

не возвращает адрес своего экземпляра? ЕСЛИ не мы можем назначить NSHost * instance = [NSHost currentHost]; это не правильно.

Третий вопрос, Я знаю, что NSString * answer = [instance localizedName]; возвращает экземпляр NSString, потому что он написан в книге, и я использую его сейчас, чтобы завершить вызов в книге. в этом коде NSString * answer = [instance localizedName] Мы назначаем указатель на указатель ?? потому что [instance localizedName] возвращает указатель NSString.

+0

Когда дело касается объектов, в Objective-C нет объектов типа Object, а только Objective-C. Другими словами, вы никогда не назначаете объекты, вы всегда назначаете указатели на объекты. – Jano

+0

@Jano - Я думаю, что вы хотите сказать, что нет такой вещи, как * variable *, которая относится к типу объекта. Очевидно, что есть объекты и у них есть типы (классы), но вы никогда не назначаете (копируете) объект, а только его указатель. –

+0

@HotLicks Да, гораздо лучше объяснил, спасибо. – Jano

ответ

5
  1. Вы не добавить &, потому что currentHost уже возвращает указатель. Проверьте свой заголовок:

    + (NSHost *)currentHost 
    

    Она возвращает NSHost* и вы назначаете его к NSHost*.

  2. [NSHost currentHost] вернет указатель на конкретный экземпляр NSHost.

  3. То же самое здесь. localizedName возвращает указатель на NSString (NSString*), и вы назначаете его одному.

+0

Привет, поэтому мы назначаем указатель на указатель с этим кодом NSHost * instance = [NSHost currentHost]; – user3090658

+0

@ user3090658 Да. – DrummerB

1

1) & 2)

NSHost *instance = [NSHost currentHost]; возвращает указатель NSHost объекта.

Так что нет необходимости ставить & до [NSHost currentHost].

В языке C:

int *ptr = NULL; 
int iVar; 

Вам необходимо присвоить адрес типа:

ptr = &iVar; 

Если оба являются указателями:

int *ptr = NULL; 
int *iVar = NULL; 

Вы можете присвоить указатель типа:

ptr = iVar; 

Это то, что вы делаете в следующем коде также:

NSHost *instance = [NSHost currentHost]; 

3)

NSString *answer = [instance localizedName]; здесь также происходит то же самое. localizedName возвращает указатель NSString

+0

Привет, поэтому мы можем установить указатель на указатель, если они содержат один и тот же адрес, или они оба являются NULL? – user3090658

+0

@ user3090658: Да. Значение этих указателей равно NULL. Это просто пример. –

13

При обучении классы Objective-C, я использую эту аналогию, чтобы объяснить (несколько запутанный) понятие указателей:

1) При создании неинициализированный переменной, как int val;, его создает «ведро», которое может содержать целое число значение. Сам ведро имеет адрес памяти .

enter image description here

2) Когда вы присвоить значение переменной с val = 5;, вы положили это значение в ведро:

enter image description here

3) указатель переменной (один с ведущей звездочкой *), как int *ptr; - это «ведро», которое не содержит значения , но адрес памяти другого «ведро»:

enter image description here

4) Для переменной указателя присвоить не значение, которое содержится в другое ведро, но адрес памяти из это другой ковш. Вы получаете «ведро адрес» ведра значения путем сдачи & (амперсанд) символа перед именем переменного:

enter image description here

Это, как говорится, когда метод уже возвращает переменную указателя (например, NSString *), вы уже получили адрес памяти и не должны запрашивать его снова, используя &.

Довести точки дома, в этом примере, мы имеем 2 ведра:

NSString *text = @"Test"; 

Первый ковш содержит значение(@ «Test»), второе ведро содержит адрес памяти первого ковша. Или, чтобы снова использовать аналогию с ведром: @"Test" находится в левом ковше, а правое ведро (переменная text) содержит адрес памяти левого ковша. Мы видим, что, запустив это:

NSLog(@"value: %@, bucket that contains value: %p, bucket that contains the memory address of the bucket containing the value: %p", text, text, &text); 
// output: value: Test, bucket that contains value: 0x1032f5030, bucket that contains the memory address of the bucket containing the value: 0x7fff5c90bb68 

Надеюсь, это поможет!

Смежные вопросы