В чем смысл идентификатора?
Я (пытаюсь) изучить 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;