(оригинал - Майк Эш, снято отсюда ) Многие разработчики Cocoa имеют довольно смутное представление об API среды выполнения Objective-C. Они знают, что он где-то существует (некоторые даже этого не знают!), что он важен и что Objective-C без него не работает, но обычно это все, что они знают. Сегодня я расскажу о том, как Objective-C работает на уровне Runtime и как конкретно его можно использовать.
Объекты
В Objective-C мы постоянно имеем дело с объектами, но что такое объект? Давайте попробуем построить что-нибудь, что поможет пролить свет на этот вопрос.Во-первых, мы все знаем, что ссылаемся на объекты с помощью указателей, например.
НСОбъект * .
Мы также знаем, что создаем их, используя +выделить .
Все, что мы можем узнать об этом из документации, это то, что это происходит при вызове +аллоквисзоне: .
Продолжая нашу цепочку исследований, мы обнаруживаем НСдефолтМаллокзоне , который создается с помощью обычного маллок .
Вот и все! Но что представляют собой созданные объекты? Что ж, посмотрим:
Мы построили иерархию классов, каждый из которых содержит переменные, и наполнили их вполне очевидными значениями.#import <Foundation/Foundation.h> @interface A : NSObject { @public int a; } @end @implementation A @end @interface B : A { @public int b; } @end @implementation B @end @interface C : B { @public int c; } @end @implementation C @end int main(int argc, char **argv) { [NSAutoreleasePool new]; C *obj = [[C alloc] init]; obj->a = 0xaaaaaaaa; obj->b = 0xbbbbbbbb; obj->c = 0xcccccccc; NSData *objData = [NSData dataWithBytes:obj length:malloc_size(obj)]; NSLog(@"Object contains %@", objData); return 0; }
Затем мы извлекли данные в удобоваримый формат, используя malloc_size , чтобы получить правильную длину и использовать НСдата чтобы напечатать все в шестнадцатеричном формате.
Вот что мы получили в результате: 2009-01-27 15:58:04.904 a.out[22090:10b] Object contains <20300000 aaaaaaaa bbbbbbbb cccccccc>
Мы видим, что в классе последовательно заполняются ячейки памяти — сначала переменная A, затем ее наследница B, а затем C. Все просто!
Но что 20300000 в начале? Они идут перед А и, следовательно, скорее всего, принадлежат НСОбъект .
Давайте посмотрим на определение НСОбъект .
/***********
Теги: #runtime #translation #objective-c #Cocoa #osx #Разработка для iOS #objective-c
-
Доски Объявлений: Работа Участника
19 Oct, 24 -
Введение В Rest Api — Веб-Службы Restful
19 Oct, 24 -
Сеть Приветствует Кризис.
19 Oct, 24 -
Яндекс И Новогодние Подарки
19 Oct, 24 -
Время Последнего Посещения
19 Oct, 24 -
Errrr — Простейший Регистратор Ошибок
19 Oct, 24