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

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

Я только начал изучать цель c, и звездочка дает мне некоторые проблемы. Когда я просматриваю образец кода, иногда он используется при объявлении переменной, а иногда и нет. Каковы "правила", когда они должны использоваться. Я думал, что это как-то связано с типом данных переменной. (звездочка необходима для типов данных объекта, не нужна для простых типов данных, таких как int). Однако я видел типы данных объекта, такие как CGPoint, объявленные без звездочки? Есть ли окончательный ответ или он связан с тем, как и для чего вы используете переменную?

4b9b3361

Ответ 1

Каковы "правила", когда они должны использоваться.

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

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

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

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

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

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

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

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

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

Ответ 2

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

Ответ 3

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

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

Ответ 4

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

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

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, без использования указателя (таким образом, вы используете *). Причина этого в том, что когда вы alloc экземпляр класса в качестве объекта, возвращается адрес памяти. Указатель - это тип переменной, который конкретно относится к местоположению памяти. Например:

NSNumber *number = [NSNumber alloc];

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


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

NSInteger integer = [NSNumber alloc];

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

integer += 4;

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


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

Ответ 5

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

Ответ 6

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

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

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