Как alloc работает в Objective C? - PullRequest
10 голосов
/ 06 января 2012

Я знаю, что alloc - это метод класса, который создает объект класса и указывает его указатель «isa» на класс, и именно так сообщения отображаются во время выполнения.

и у меня есть представление о allocWithZone и зонах.

Может кто-нибудь сказать мне или указать мне хорошую ссылку, которая объясняет: -

Как указатель указывает на правильный класс?

Сколько памяти выделено?

Как создается память для членов, унаследованных от родительского класса?

Если id является typedef для objc_object *, на что указывает его указатель isa, то как он хранит anyobject, потому что указатель isa приведет нас к таблице диспетчеризации, в которой есть селекторы для методов, но есть ли у них что-нибудь, что говорит нам, что Предполагается ли присутствие членов-данных?

Ответы [ 2 ]

9 голосов
/ 06 января 2012

Компилятор вставляет вызовы через среду выполнения objc для вас, за кулисами. Вы можете найти библиотеку в вашем пути включения objc/. objc/runtime.h будет, вероятно, наибольший интерес. В качестве бонуса некоторые избранные сообщения обойдут objc_msgSend с этими вставками.

Как указатель указывает на правильный класс?

objc_constructInstance

Сколько памяти выделено?

class_createInstance
class_getInstanceSize

Как создается память для членов, унаследованных от родительского класса?

Память обнуляется, и isa установлено.

Если id является typedef для objc_object *, на что указывает его указатель isa, то как он хранит anyobject, потому что указатель isa приведет нас к таблице диспетчеризации, в которой есть селекторы для методов, но есть ли у них что-либо, что говорит нам, какие данные члены должны быть там?

Все, что было установлено при инициализации. Указатели объектов ObjC - это просто необработанная память. В отличие от других языков, приведение и преобразование письменных типов является прямым набором адреса переменной - в следующей конструкции нет явного продвижения или преобразования типов в памяти:

MONDisplay * display = [NSString string];
NSLog(@"%@", display);

указатель - это то же самое значение, которое возвращает [NSString string].

2 голосов
/ 09 января 2012

Просто, чтобы добавить к обсуждению, я получил очень хорошую ссылку на один из моих других подобных вопросов о внутренних предметах Objective-C.

http://algorithm.com.au/downloads/talks/objective-c-internals/objective-c-internals.pdf

Я надеюсь, что это будетпомогите многим, кто сюда приедет:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...