Страницы

Поиск по вопросам

воскресенье, 24 ноября 2019 г.

Чем отличается экземпляр класса от объекта класса?


Чем отличается экземпляр класса от объекта класса в 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

Комментариев нет:

Отправить комментарий