Справка по Objective-C / iPhone SDK - PullRequest
0 голосов
/ 16 ноября 2010

Я новичок в разработке для iPhone, и я вроде как с указателями в Objective-C. Кто-нибудь может кратко объяснить мне указатели? Я знаю, что некоторые нативные типы C не нуждаются в указателях (то есть слабо типизированы), например int.

Кроме того, в чем разница между:

NSDate* theDate = [NSDate date];

и

NSDate *theDate = [NSDate date];

Еще раз спасибо StackOverflow!

Ответы [ 3 ]

2 голосов
/ 16 ноября 2010

Нет никакой разницы между этими двумя вещами.Звездочка обозначает указатель, но может иметь любые пробелы, которые вам нравятся с обеих сторон.Например, следующее также верно:

NSDate * theDate = [NSDate date];

Создатели Objective-C решили добавить объекты в C, оставив их всех в куче (то есть, это вещи, которые вы явно создаете и уничтожаете - неттакая вещь, как локальный объект в Objective-C) и ссылки на них через указатели.Указатели - это просто адреса памяти.Так что «NSDate *» не является NSDate, это просто запись того, где в памяти находится объект NSDate.Точно так же, как разница между адресом улицы и домом.

Примитивные операции (такие как сложение, умножение и т. Д.) Работают только с примитивными типами C, такими как int, short, float и т. Д. Технически указатели, которые вы сохраняетеОбъекты Objective-C являются примитивными типами, потому что у вас есть адрес, а не объект.Но они, как правило, не очень полезны.

Вы оперируете объектами, только отправляя им сообщения.Синтаксис в квадратных скобках означает «отправить это сообщение этому объекту».Что, когда вы только начинаете, достаточно похоже на вызов функции, чтобы просто думать об этом как об этом.Существует различие в том, что некоторые вещи C делают во время компиляции, Objective-C делает во время выполнения.Но вы можете просто поверить, что они уже сделаны.

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

На практике все объекты происходят от NSObject, поэтому часто бывает полезнее использовать NSObject * иявное приведение при смене типа.Это означает, что вы можете использовать то, что NSObject добавляет без предупреждений компилятора, включая подсчет ссылок в Objective-C, вещи для выяснения, может ли объект выполнить определенное сообщение и т. Д.

1 голос
/ 16 ноября 2010

Нет никакой разницы между NSDate* theDate; и NSDate *theDate;, но были войны, ведущиеся в отношении того, что является предпочтительным стилем, точно так же, как была война, если {должно быть в той же строке или следующей. Вы можете набрать NSDate*thedate;, чтобы угодить обеим сторонам:).

Указатель - это значение с информацией о том, где найти другое значение.

  • char - фактическое 8-битное целочисленное значение.
  • char* - это 32- или 64-битное значение с информацией о том, где можно найти 8-битное целое число char.

Вы можете сделать "указатель на" любого значения, просто добавив суффикс любого типа к *. Вы можете даже быть рекурсивным, если хотите; char** - указатель на указатель на 8-битное целочисленное значение.

C имеет концепцию структур, то есть группирует значения, потенциально разных типов, которые должны рассматриваться как составные значения. Например:

typedef struct {
    float CGFloat;
    float CGFloat;
} CGPoint;

Структуры обрабатываются как атомарные значения, это имеет некоторые последствия, как показано в этом примере:

CGPoint p1 = CGPointMake(1, 42);
CGPoint p2 = p1;              // a COPY of p1 is made.
STAssert(p1.x == p1.x, @"");  // Is true
p2.x = 10;                    // p1.x is NOT affected.
STAssert(p1.x == p2.x, @"");  // Is no longer true

Как выясняется, объекты в Objective-C на самом деле являются структурами. Фактические члены этих структур отвлечены от вас, но они все еще есть.

Вы хотите иметь возможность передавать объекты, чтобы изменения, внесенные в одну часть вашего кода, переносились на другие части вашего кода. Это можно сделать, если вы только передаете указатели объектам, а не самим объектам. Тогда каждое изменение с помощью этих указателей будет выполняться для одного и того же фактического объекта.

Следовательно: NSDate* не NSDate.

1 голос
/ 16 ноября 2010

нет, но вы можете предпочесть второй, поскольку гораздо более явно, что theDate является указателем

NSDate * theDate = [NSDate date];

тоже самое делает

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