Когда новый объект создается и инициализируется, почему мы используем id? Не можем ли мы использовать (NSObject *)?Почему не использовать NSObject при инициализации вместо id
ответ
Не каждый объект в Objective C равен NSObject
. Существуют и другие корневые классы (например, NSProxy
), которые не получены из NSObject
.
id
означает абсолютно любой объект. Все объекты Objective C, которые могут принимать сообщения (включая Class
), могут быть переданы как id
без предупреждений типа.
NSObject*
полезен только для объектов, которые фактически получены из NSObject
. Если вы передадите что-то, что не получено из него, введите checker, который будет жаловаться.
Почти; одна важная причина, по которой используется 'id', заключается в том, что она не требует приведения к более конкретному типу, тогда как' NSObject * '. – bbum
Потому что NSObject
- это отдельный класс Objective C. Это базовый класс для большинства всего (* но не все, +1 к HamsterGene), но это все еще класс.
И если вы назначили новый объект (любого типа, который спускается от NSObject
) к нему, вы потеряете Наследование & свойства из любой подклассы типа вы были созданы были.
id
является roughly equivalent к void *
в его поведение, где вы можете назначить любой Objective объекта C к id
, например, как вы можете назначить любой случайный блок памяти (без ухода за это содержание или типа) к void *
.
Да, вы можете. Вот [статья] (http://unixjunkie.blogspot.com/2008/03/id-vs-nsobject-vs-id.html), которая объясняет все это ... – demon9733