Когда должен Вы не использовать звездочку (*) при объявлении переменной в Objective C

«метод» является объектно-ориентированным словом для «функция» . Это в значительной степени все, что есть (т.е. никакой реальной разницы).

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

Действительно - здесь не так уж много, просто разные слова для одной и той же вещи.

[позднее добавление]


Фактически, как Брайан Нил указал в комментарии к на этот вопрос , стандарт C ++ никогда не использует термин 'метод' при обращении к функциям-членам. Некоторые люди могут принять это как признак того, что C ++ на самом деле не является объектно-ориентированным языком; однако я предпочитаю воспринимать это как признак того, что довольно умная группа людей не думала, что есть особенно веская причина использовать другой термин.

10
задан Dan Rosenstark 21 March 2010 в 23:04
поделиться

6 ответов

Каковы «правила», когда его следует использовать.

Вы используете звездочку для объявления указателя.

Для объекта Какао вы всегда объявляете указатель , поэтому всегда используйте звездочку. Вы не можете поместить сам объект в переменную; вы всегда обрабатываете указатель на объект.

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

У вас даже может быть указатель на указатель; как и следовало ожидать, здесь задействовано несколько звездочек. Например, NSRect ** - это указатель на указатель на NSRect (который является структурой, а не объектом Какао).

Я думал, что это как-то связано с типом данных переменной. (звездочка необходима для типов данных объекта, не требуется для простых типов данных, таких как int)

Типа. Звездочка необходима для объектов Какао, потому что вы можете обрабатывать только указатели на объекты Какао, но не сами объекты. Но правила объявления для объектов Какао не отличаются; они точно такие же. Вы используете звездочку, когда вам нужна переменная-указатель; вы этого не делаете, когда вам нужна переменная без указателя.

Единственное исключение, единственное отличие для объектов Какао от обычных правил, состоит в том, что вам не разрешено объявлять переменную, содержащую сам объект. Который' s почему вы никогда не видите переменную, содержащую объект Какао вместо указателя на один: компилятор не разрешает этого.

Однако я встречал такие типы данных объектов, как CGPoint, объявленные без звездочки?

CGPoint - это структура, а не объект Какао. Таким образом, вы можете объявить переменную, которая содержит CGPoint, а не указатель на нее где-то еще.

17
ответ дан 3 December 2019 в 14:25
поделиться

Похоже, вы выяснили правило: звездочка для указателя, без звездочки в противном случае. Проблема в том, что нет правила для определения того, потребуется ли что-то вроде CGPoint указатель без просмотра файла заголовка. Как сказал Велбог, реальное различие между тем, когда использовать / не использовать указатель, заключается в том, выделяете ли вы память в куче или стеке, хотя в большинстве случаев вам нужно только определить, работаете ли вы с объектом ( звездочка) или примитив (без звездочки).

0
ответ дан 3 December 2019 в 14:25
поделиться

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

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

6
ответ дан 3 December 2019 в 14:25
поделиться

Я думаю, вам следует сначала прочитать немного о программировании на C. Objective-C - это надмножество C. Причина, по которой вы не используете * для объявления CGPoint, заключается в том, что CGPoint - это структура, посмотрите заголовочный файл CGGeometry.h.

7
ответ дан 3 December 2019 в 14:25
поделиться

Ответ очень прост: вы должны всегда использовать звездочку при использовании объектов Objective-C.

Причина в том, что они не могут быть размещены в стеке, поэтому вы не можете делать то, что можете делать с такими структурами, как CGPoint.

Разработчики Objective-C решили, я полагаю, заставлять вас всегда добавлять это звездочкой, потому что они являются указателями на память, как и другие указатели C.

0
ответ дан 3 December 2019 в 14:25
поделиться

Вы используете * , когда тип переменной является классом.

Пример может помочь.

NSNumber *number;
NSInteger integer;

Тип переменной NSNumber - это класс, а NSInteger - просто другое имя для обычного C-типа int . Как вы можете видеть здесь, компилятор заменяет каждое вхождение NSInteger на int :

#if __LP64__ || NS_BUILD_32_LIKE_64
  typedef long NSInteger;
  typedef unsigned long NSUInteger;
#else
  typedef int NSInteger;
  typedef unsigned int NSUInteger;
#endif

Кроме того, вы не можете объявить экземпляр класса (объекта), например NSNumber , без с помощью указателя (таким образом, вы используете * ). Причина в том, что когда вы выделяете экземпляр класса в качестве объекта, возвращается адрес памяти. Указатель - это тип переменной, которая конкретно относится к области памяти. Например:

NSNumber *number = [NSNumber alloc];

Здесь числовое значение number будет ячейкой памяти, например 0x19a30c0 . Вы можете работать с ним, складывая и вычитая, как int . Основная цель объявления его как указателя NSNumber состоит в том, чтобы компилятор мог помочь кодировщику проверить наличие у класса определенных методов или получить доступ к известным свойствам.


И последний пример:

NSInteger integer = [NSNumber alloc];

Каким будет значение integer ? В нашем примере это будет 0x19a30c0. При этом вы все еще можете получить доступ к недавно выделенному объекту NSNumber через [integer someMethod] . Однако компилятор выдаст вам предупреждение. Более того:

integer += 4;

Это повлияет на числовое значение 0x19a30c0 , добавив к нему 4 и сделав его 0x19a30c4 .


Посмотрите эту статью в Википедии о C / C ++ указатели для еще нескольких примеров того, как, когда и зачем использовать оператор * .

При этом вы все еще можете получить доступ к недавно выделенному объекту NSNumber через [integer someMethod] . Однако компилятор выдаст вам предупреждение. Более того:

integer += 4;

Это повлияет на числовое значение 0x19a30c0 , добавив к нему 4 и сделав его 0x19a30c4 .


Посмотрите эту статью в Википедии о C / C ++ указатели для еще нескольких примеров того, как, когда и зачем использовать оператор * .

При этом вы все еще можете получить доступ к недавно выделенному объекту NSNumber через [integer someMethod] . Однако компилятор выдаст вам предупреждение. Более того:

integer += 4;

Это повлияет на числовое значение 0x19a30c0 , добавив к нему 4 и сделав его 0x19a30c4 .


Посмотрите эту статью в Википедии о C / C ++ указатели для получения дополнительных примеров того, как, когда и зачем использовать оператор * .

4
ответ дан 3 December 2019 в 14:25
поделиться