Чем отличается экземпляр класса от объекта класса в objective-c?
Задали такой вопрос на собеседовании, я в недоумении ответил "Не понимаю вопроса, разве это не одно и то же?".
Просьба сильно не пинать, обж-си учил сам, в ускоренном темпе, и времени разбираться с самой концепцией не было.
Ответы
Ответ 1
Я думаю, Вы попали под раздачу из-за недостаточной квалификации собеседующего… если заниматься прямым переводом терминов, то можно много интересного узнать :).
В документации по Obj-C используются термины class object и class instance. Есл
их дословно перевести на русский, то получится как раз то, о чём Вас спрашивали. Причё
в русском языке естественно объект класса считать его экземпляром. В то время, как совершено очевидно, что означает английский термин class object — этот объект, в котором хранится, так сказать, информация о классе.
Class Objects
A class definition contains various
kinds of information, much of it about
instances of the class:
The name of the class and its superclass
A template describing a set of instance variables
The declarations of method names and their return and argument types
The method implementations
This information is compiled and
recorded in data structures made
available to the runtime system. The
compiler creates just one object, a
class object, to represent the class.
The class object has access to all the
information about the class, which
means mainly information about what
instances of the class are like. It’s
able to produce new instances
according to the plan put forward in
the class definition.
Although a class object keeps the
prototype of a class instance,
it’s not an instance itself. It has no instance variables of its own and
it can’t perform methods intended for
instances of the class. However, a
class definition can include methods
intended specifically for the class
object—class methods as opposed to
instance methods. A class object
inherits class methods from the
classes above it in the hierarchy,
just as instances inherit instance
methods.
Ответ 2
Если подходить с чисто утилитарной точки зрения, то в Objective-C вы можете для любого класа определить два типа методов:
Методы класса - начинаются с + , иногда называются singleton -- по-русски и не выговорить. Суть их в том, что для их вызова НЕ НУЖНО создавать экземпляр класса.
Примером может служить, например, [UIColor greyColor]. Объекты, полученные таки
способом не требуют последующего освобождения механизмами управления памятью. В ряде случаев использование таких методов очень удобно.
Методы экземпляра объекта. - их объявление начинается с - . Это классические методы, которые работают только после того, когда вы создали объект с помощью alloc.
Вероятно, именно об этом вас и спрашивали на собеседовании :-)
Ответ 3
Объект класса содержит все статические свойства, а экземпляр класса содержит вс
не статические свойства. Объект класса инициализируется при обращение к классу или при создании экземпляра, поэтому возможна данная конструкция [UIColor greyColor]. А экземпляр класса инициализируется только при его создании.
Добавлю еще:
В методы экземпляра "-" компилятор за нас добавляет переменную this (ссылку на экземпляр)
а в методы методы класса "+" (в других языках их называют статическими) он этого не делает, поэтому внутри него нельзя обратится к экземпляру.
Ответ 4
struct objc_class {
struct objc_class *isa;
struct objc_class *super_class;
const char *name;
long version;
long info;
long instance_size;
struct objc_ivar_list *ivars;
#if defined(Release3CompatibilityBuild)
struct objc_method_list *methods;
#else
struct objc_method_list **methodLists;
#endif
struct objc_cache *cache;
struct objc_protocol_list *protocols;
};
Наверное, так будет понятней, что имеется в виду под объектом класса. http://www.opensource.apple.com/source/objc4/objc4-208/runtime/objc-class.h
Комментариев нет:
Отправить комментарий