Что означает id?

97

Я (пытаюсь) изучить Objective-C и постоянно сталкиваюсь с такой фразой:

-(id) init;

Насколько я понимаю id, это ключевое слово языка Objective C, но что означает idвыражение «компилятор специально обрабатывает правила преобразования типа указателя»?

Есть ли idавтоматически определять объект справа как указатель?

GPP
источник
28
Это противоположность эго. Для некоторых этоvoid*
Hot Licks
Вот обсуждение, относящееся к вопросу: ТАК вопрос
дмитрий

Ответы:

122

idявляется указателем на любой тип, но в отличие от void *него всегда указывает на объект Objective-C. Например, вы можете добавить idв NSArray все, что угодно, но эти объекты должны отвечать на retainи release.

Компилятор полностью счастлив, если вы неявно приведете любой объект id, а вы - idк любому объекту. Это не похоже на любое другое неявное приведение типов в Objective-C и является основой для большинства типов контейнеров в Какао.

Джерик
источник
11
Дополнение: id определение есть typedef struct objc_object *id;, значит, это указатель на Objcобъект.
zhongwuzw 09
это то же самое, что NSObject? означает, могу ли я заменить idна, NSObjectкогда это возвращаемый тип?
ThunderWiring
Документ Apple: developer.apple.com/documentation/objectivec/id?language=objc
Врадж Пандья,
33

idявляется указателем на любой объект Objective-C ( objc_object). Это не просто указатель на пустоту, и вы не должны относиться к нему так же. Он ссылается на объект, который должен иметь действительный isaуказатель. Значения, которые могут быть сохранены id, также не ограничиваются только NSObjectего потомками, что начинает понимать существование NSObjectпротокола, а также NSProxyкласса, от которого даже не наследуется NSObject. Компилятор позволит вам назначить объект, на который ссылается тип, idлюбому типу объекта, назначить ему любой тип объекта id, а также отправить ему любое сообщение (которое компилятор видел) без предупреждения.

Джо
источник
25

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

Некоторые дополнительные ресурсы:
id vs NSObject vs id *
Objective-C Programming (Wikibooks)
Самоанализ
Динамический ввод

FeifanZ
источник
9
  • id - это тип данных идентификаторов объектов в Objective-C, который можно использовать для объекта любого типа, независимо от того, какой у него класс. id - последний супертип всех объектов.

В java или c # мы используем вот так

 Object data = someValue;


 String name =(Object)data;

но в объекте c

id data= someValue;



NSString *name= data;
ChancyWu
источник
5

Да и нет. Верно, что наличие id xобозначает x как указатель, но утверждение, что применяются правила преобразования типа указателя, неверно, потому что «id» имеет специальные правила преобразования типа. Например, с void *указателем этого сделать нельзя:

void *x;
char *y = x; // error, this needs an explicit cast

Напротив, это возможно с id:

id x;
NSString *y = x;

См. Больше примеров использования идентификатора типа в примерах с .

Кроме того, в «современной» Objective C предпочтительнее использовать instancetypeвместо id в методах «init». В Xcode есть даже инструмент автоматического преобразования для изменения этого. Прочтите об instancetype: было бы полезно начать использовать instancetype вместо id?

Battlmonstr
источник