Яке значення id?


97

Я (намагаюся) вивчити Objective-C, і я постійно натрапляю на фразу типу:

-(id) init;

Я розумію id, що це ключове слово мови Objective C, але що означає сказати "компілятор спеціально обробляє idз точки зору правил перетворення типу покажчика"?

Чи idавтоматично позначає об'єкт праворуч як вказівник?


28
Це протилежність его. Для деяких людей цеvoid*
Hot Licks

Ось дискусія, що стосується питання: ТАК запитання
dmitri

Відповіді:


122

idє вказівником на будь-який тип, але на відміну від void *нього завжди вказує на об'єкт Objective-C. Наприклад, ви можете додати будь-який тип idдо NSArray, але ці об’єкти повинні відповідати на retainта release.

Компілятор цілком радий, що ви неявно передаєте будь-який об’єкт id, і ви можете передавати idйого будь-якому об'єкту. Це на відміну від будь-якого іншого неявного лиття в Objective-C, і є основою для більшості типів контейнерів у Какао.


11
Доповнення: id визначенням є typedef struct objc_object *id;, тож воно вказує на Objcоб'єкт.
zhongwuzw

це те саме, що NSObject? значить, я можу замінити idз , NSObjectколи це тип повертається значення ?
ThunderWiring


33

idє вказівником на будь-який об'єкт Objective-C ( objc_object). Це не просто порожній покажчик, і ви не повинні ставитися до цього так. Він посилається на об'єкт, який повинен мати дійсний isaвказівник. Значення, в яких можна зберігати id, також не обмежуються лише NSObjectйого та його нащадками, що починає мати сенс існування NSObjectпротоколу, а також NSProxyкласу, від якого навіть не успадковується NSObject. Компілятор дозволить вам призначити об'єкт, на який посилається тип, idдо будь-якого типу об'єкта, призначити будь-який тип об'єкта id, а також надіслати йому будь-яке повідомлення (яке бачив компілятор) без попередження.


25

idє родовим типом. Це означає, що компілятор очікує будь-якого типу об'єкта там і не буде застосовувати обмеження. Це може бути корисно, якщо ви розраховуєте використовувати там більше одного класу об'єктів; потім ви можете використовувати самоаналіз, щоб з’ясувати, про який клас йдеться. idавтоматично приймає вказівник, оскільки всі об'єкти в Objective-C передаються як покажчики / посилання.

Деякі додаткові ресурси:
id проти NSObject проти id *
Програмування Objective-C (Wikibooks)
Самоаналіз
Динамічне введення тексту


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

У Java або c # ми використовуємо ось так

 Object data = someValue;


 String name =(Object)data;

але в об'єктивному с

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;

Дивіться більше використання ідентифікатора типу в об'єктивних прикладах c .

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.