Среда Выполнения Objective-C Изнутри

(оригинал - Майк Эш, снято отсюда ) Многие разработчики 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

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.