По сравнению с «Lingboweibu» The Swift, Объект-C известен как «Ладонь Будды». Время выполнения должно поддерживать легенду, которая лучше всего отражает аргумент «Ладонь Будды». Всегда звучит так загадочно старший, поэтому информацию всегда можно увидеть обломками на различных форумах, где со временем всего не упомнишь где, каждый раз открывая несколько веб-страниц. Это, очевидно, не помнить, как сейчас важное проявление системы знаний не завершено. Или ваши собственные идеи в руках из представления кода среды выполнения, сделанные на резюме по-прежнему лучшей политики.

I. Основные понятия

1.RunTime для короткого прогона, т. е. когда в системе работает ряд механизмов, наиболее важным является механизм сообщений.
2. Для вызова функции языка C во время компиляции будет определяться, какую функцию вызывать вызов языка C см. здесь). Прямое исполнение ордера после компиляции без какой-либо двусмысленности остается.
3. Вызовы функций OC становятся сообщениями. Это динамическая вызывающая процедура. Во время компиляции и не может толком решить, какую функцию вызывать (оказывается, во время компиляции OC может вызывать любую функцию, даже если эта функция не была достигнута, главное, чтобы ошибка тоже не объявлялась, тогда как компилятор языка C будет жаловаться стадии).
4. Только когда вы действительно запустите, вы найдете соответствующую функцию в соответствии с именем функции для вызова.

Документ на официальном веб-сайте также содержит инструкции по работе с традиционными и современными версиями среды выполнения:

1. В устаревшей среде выполнения, если вы изменяете расположение переменных экземпляра в классе, вы должны перекомпилировать классы, которые унаследованы от него.

2. В современной среде выполнения, если вы измените расположение переменных экземпляра в классе, вам не нужно перекомпилировать классы, которые унаследованы от него.
Кроме того, современная среда выполнения поддерживает синтез переменных экземпляра для объявленных свойств (см. Объявленные свойства в языке программирования Objective-C).

II. Идентификация конкретной реализации вызова метода OC в среде выполнения

  1. Код OC вызывает метод.
[self.loginBt login];

2. В приведенном выше коде время компиляции будет преобразовано в RunTime [Отправить сообщение]

objc_msgSend(self.loginBt,@selector(login));

III. Общее действие

Так как это «Ладонь Будды» может быть просто объявлено вне закона, улица остановила мужчину и спросила: «Это лошадь или олень, а?» лошадь, олень олень ~. «Время выполнения большое быстро» вау-ха-ха-ха ~ вижу, как ты вел себя, я не буду так сложно для вас. Вам не хватает осла, верно? Thisadults сейчас делает доставку к вам, вернуться домой! О ~ ха-ха-ха».

О, оторвитесь, вернитесь к роли Runtime. Всемогущая вещь не вводится поодиночке, несколько мест чаще используют следующий вбив:

1. Переменные-члены и метод для динамического добавления объектов.
2. Два метода динамической замены.
3. Вы также можете добавить атрибуты для классификации.
4. Реализовать автоматическое согласование архивации NSCoding. файл.
5. Реализовать автоматическое преобразование модели ротации словаря.

IV. Написать код

  1. Динамическое управление переменными
    1) Смысл:
Teacher: What's your name?  
XiaoMing: My name is XiaoMing.  
Teacher: Pardon?  
XiaoMing: My name is __

Среди программ, предполагающих имя исходного значения XiaoMing XiaoMing, более поздняя замена имени Minggo во время выполнения. Итак, Runtime — это как это сделать?

2) Шаг:
① динамический доступ ко всем свойствам класса XiaoMing [конечно, включая частные]

Ivar *ivar = class_copyIvarList([self.xiaoMing class], &count);

② атрибут обхода, чтобы найти соответствующее поле имени

const char *varName = ivar_getName(var);

③ изменить соответствующие значения полей в Minggo

object_setIvar(self.xiaoMing, var, @"Minggo");

3) Показать код:

-(void)answer{
    unsigned int count = 0;
    Ivar *ivar = class_copyIvarList([self.xiaoMing class], &count);
    for (int i = 0; i<count; i++) {
        Ivar var = ivar[i];
        const char *varName = ivar_getName(var);
        NSString *name = [NSString stringWithUTF8String:varName];

        if ([name isEqualToString:@"_englishName"]) {
            object_setIvar(self.xiaoMing, var, @"Minggo");
            break;
        }
    }
    NSLog(@"XiaoMing first answer is %@",self.xiaoMing.englishName);
    self.nameTf.text = self.xiaoMing.englishName;
}

2. Метод динамического обмена

1) смысл:

Teacher: What's your name?  
XiaoMing: My name is XiaoMing.  
Teacher: Pardon?  
XiaoMing: My name is __

В программе, которая впервые предполагает, что XiaoMing отвечает firstSay, позже Runtime обменивается именем метода secondSay, а затем вызывает firstSay final, когда на самом деле называется реализация secondSay. Итак, Runtime — это как это сделать?

2)Шаг:

① динамический метод для поиска первого дня и второго дня

Method m1 = class_getInstanceMethod([self.xiaoMing class], @selector(firstSay));
Method m2 = class_getInstanceMethod([self.xiaoMing class], @selector(secondSay));

②обмен двумя методами

method_exchangeImplementations(m1, m2);

3) Показать код:

-(void)answer{
    Method m1 = class_getInstanceMethod([self.xiaoMing class], @selector(firstSay));
    Method m2 = class_getInstanceMethod([self.xiaoMing class], @selector(secondSay));
    method_exchangeImplementations(m1, m2);
    NSString *secondName = [self.xiaoMing firstSay];
    self.nameTf.text = secondName;
    NSLog(@"XiaoMing:My name is %@",secondName);
}

3. Динамически добавлять методы

1) смысл:

Teacher: Where is LiLei from?
XiaoMing: I don't know.
Teacher: Guess?.
LiHua: He is from __

Среди программ, предполагающих, что XiaoMing не угадал этот метод, позже было добавлено имя угадывать методы выполнения и, в конечном итоге, делать соответствующие вызовы угадыватьметод. Итак, время выполнения, как это сделать?

2)Шаг:

① Динамически добавлять методы для угадывания класса XiaoMing:

class_addMethod([self.xiaoMing class], @selector(guess), (IMP)guessAnswer, "v@:");

Параметры размещаются здесь для пояснения:
(IMP) "догадка" означает "угадай ответ" указатели адреса;
"V @:" означает, что v не представляет собой возвращаемое значение void, если это i представляет int; @ Идентификатор представителя sel;: Представитель SEL _cmd;
«V @:@@» означает, что значения двух параметров не возвращаются.

②Вызывает метод предположения для ответа на события:

[self.xiaoMing performSelector:@selector(guess)];

③Напишите вариант реализации ответа:

void guessAnswer(id self,SEL _cmd){
    NSLog(@"He is from GuangTong");   
}

На это можно посмотреть в двух местах:
1.void no +, — Нет, потому что это всего лишь код на C.
2. Должно быть два заданных параметра (id self, SEL _cmd)

3) Показать код:

-(void)answer{
    class_addMethod([self.xiaoMing class], @selector(guess), (IMP)guessAnswer, "v@:");
    if ([self.xiaoMing respondsToSelector:@selector(guess)]) {
        [self.xiaoMing performSelector:@selector(guess)];
    } else{
        NSLog(@"Sorry,I don't know");
    }
    self.cityTf.text = @"GuangTong";
}
void guessAnswer(id self,SEL _cmd){
    NSLog(@"He is from GuangTong");
}

4. Динамические свойства для категории Расширение Плюс

К этому моменту есть два экспресса: во-первых, XCode запускает вашу подтверждающую категорию .h fileProperty, компилятор, но если во время выполнения нет процесса выполнения, значение присвоения немедленно дается. Во-вторых, и это часто встречается среди iOS интервью с вопросом: Как добавить расширенные атрибуты? .

1) смысл:

Teacher: What's your Chinese name?
XiaoMing: I have no one.
LiHua: You should have one.
LiHua: Your Chinese name is __

Среди программы, предполагая XiaoMing Есть нет chineseName это свойство, а позже добавлено имя chineseName свойства Runtime. Итак, Runtime — это как это сделать?

2)Шаг:

①Подтверждение свойства chineseName

#import "XiaoMing.h"
@interface XiaoMing (MutipleName)
@property(nonatomic,copy) NSString *chineseName;
@end

②Динамическое добавление атрибутов и реализации

#import "XiaoMing+MutipleName.h"
#import <objc/runtime.h>
@implementation XiaoMing (MutipleName)
char cName;
-(void)setChineseName:(NSString *) chineseName{
       objc_setAssociatedObject(self, &cName, chineseName, OBJC_ASSOCIATION_COPY_NONATOMIC);
}
-(NSString *)chineseName{
    return objc_getAssociatedObject(self, &cName);
}
@end

③Использовать свойство chineseName

-(void)answer{
    NSLog(@"My Chinese name is %@",self.xiaoMing.chineseName);
    self.chineseNameTf.text = self.xiaoMing.chineseName;
}

3) Показать код:

Вышеупомянутое является самым разыскиваемым в Кодексе. Следующие более захватывающими.

V. рендеринг более интуитивный

VI. Источник Скачать подробнее

https://github.com/minggo620/iOSRuntimeLearn.git