В чем смысл идентификатора?

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

-(id) init;

И я понимаю, что id - это ключевое слово Objective C, но что значит сказать: "компилятор специально рассматривает id в терминах правил преобразования типа указателя"?

Указывает ли id объект справа на него как указатель?

Ответ 1

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

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

Ответ 2

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

Ответ 3

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

Некоторые дополнительные ресурсы:

id vs NSObject vs id *
Objective-C Программирование (Wikibooks)
Introspection
Динамический ввод

Ответ 4

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

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

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

id x;
NSString *y = x;

Подробнее об использовании типа id в объектных примерах c.

Кроме того, в "современной" цели C предпочтительнее использовать instancetype вместо "id" в методах "init". Там даже инструмент автоматического преобразования в Xcode для его изменения. Читайте об instancetype: Было бы полезно начать использовать instancetype вместо id?

Ответ 5

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

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

 Object data = someValue;


 String name =(Object)data;

но в объективе c

id data= someValue;



NSString *name= data;