Я (пытаюсь) изучить Objective-C и постоянно сталкиваюсь с такой фразой:
-(id) init;
Насколько я понимаю id
, это ключевое слово языка Objective C, но что означает id
выражение «компилятор специально обрабатывает правила преобразования типа указателя»?
Есть ли id
автоматически определять объект справа как указатель?
objective-c
types
GPP
источник
источник
void*
Ответы:
id
является указателем на любой тип, но в отличие отvoid *
него всегда указывает на объект Objective-C. Например, вы можете добавитьid
в NSArray все, что угодно, но эти объекты должны отвечать наretain
иrelease
.Компилятор полностью счастлив, если вы неявно приведете любой объект
id
, а вы -id
к любому объекту. Это не похоже на любое другое неявное приведение типов в Objective-C и является основой для большинства типов контейнеров в Какао.источник
id
определение естьtypedef struct objc_object *id;
, значит, это указатель наObjc
объект.NSObject
? означает, могу ли я заменитьid
на,NSObject
когда это возвращаемый тип?id
является указателем на любой объект Objective-C (objc_object
). Это не просто указатель на пустоту, и вы не должны относиться к нему так же. Он ссылается на объект, который должен иметь действительныйisa
указатель. Значения, которые могут быть сохраненыid
, также не ограничиваются толькоNSObject
его потомками, что начинает понимать существованиеNSObject
протокола, а такжеNSProxy
класса, от которого даже не наследуетсяNSObject
. Компилятор позволит вам назначить объект, на который ссылается тип,id
любому типу объекта, назначить ему любой тип объектаid
, а также отправить ему любое сообщение (которое компилятор видел) без предупреждения.источник
id
является универсальным типом. Это означает, что компилятор будет ожидать там любой тип объекта и не будет применять ограничения. Это может быть полезно, если вы планируете использовать там более одного класса объектов; затем вы можете использовать самоанализ, чтобы выяснить, к какому классу это относится.id
автоматически предполагает указатель, поскольку все объекты в Objective-C передаются как указатели / ссылки.Некоторые дополнительные ресурсы:
id vs NSObject vs id *
Objective-C Programming (Wikibooks)
Самоанализ
Динамический ввод
источник
В java или c # мы используем вот так
но в объекте c
источник
Да и нет. Верно, что наличие
id x
обозначает x как указатель, но утверждение, что применяются правила преобразования типа указателя, неверно, потому что «id» имеет специальные правила преобразования типа. Например, сvoid *
указателем этого сделать нельзя:Напротив, это возможно с id:
См. Больше примеров использования идентификатора типа в примерах с .
Кроме того, в «современной» Objective C предпочтительнее использовать
instancetype
вместо id в методах «init». В Xcode есть даже инструмент автоматического преобразования для изменения этого. Прочтите об instancetype: было бы полезно начать использовать instancetype вместо id?источник