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


97

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

-(id) init;

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

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


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


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)
Самоанализ
Динамический ввод


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

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

 Object data = someValue;


 String name =(Object)data;

но в объекте c

id data= someValue;



NSString *name= data;

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?

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.