Вот-вот, это как раз и интересно. Понятно что как вариант можно таскать с собой флэшку с линуксом по магазинам и просить продавцов попробовать загрузиться с разных планшетов:) Но все-же хочется какой-то более подробной информации.
Сноуден больше года уже здесь сидит, и ни одного интервью на Хабре! (да хотя-бы и через Тор). Может, администрация попробует организовать, пока он обратно не свалил?
Спасибо, жду продолжения!
Кстати, в примере с добавлением метода вместо
[myObj performSelector:@selector(appleSecret)];
можно просто написать
[myObj appleSecret];
будет warning, но все будет работать.
Для тех, у кого нет OSX и желания/возможности возиться с виртуалками, рекомендую www.tutorialspoint.com/compile_objective-c_online.php — там хоть и линукс, но с gnustep, что ближе к реальной макоси чем просто gcc (который тоже умеет компилировать objc).
Кстати, возникает вопрос — возможно ли прототипное ООП на objc, иными словами, можно ли добавить метод не в класс, а в объект; или сделать в рантайме копию объекта класса и использовать ее для некоторых объектов…
Все просто: чем ближе глаза к монитору — тем больше кажется что оно бело-золотое. Чем дальше — тем больше кажется что оно сине-черное.
На расстоянии меньше метра бело-золотое, больше трех метров — сине-черное. Под углом тоже больше сине-черного.
Вижу как белый с «золотым» (который может быть и грязно бежевым и даже грязно-зеленым). Чтобы увидеть его хотя-бы слегка «сине-черным», пришлось сильно уменьшить картинку и прищуриться так, чтобы в глаза попадало гораздо очень мало света… тогда более светлый «белый» трансформируется в синий (потому что он и на самом деле не чисто белый, а более холодный, синеватый), а более темный «грязно-золотой» сообще перестает различаться как цвет и становится черным.
Хотя яркость монитора и так на самом минимуме, не люблю когда светит в глаза.
Огромное спасибо за продолжение, жду следующих статей!
Некоторые мысли (я не имею практического знания ObjC, но тема очень интересная, какие-то мысли приходят в голову...)
У каждого объекта класса есть скрытое поле с именем isa, которое указывает на специальный объект, описывающий класс в рантайме. Там, в этом объекте хранится по сути таблица соответствия селекторов и функций. Это похоже на таблицу виртуальных функций? Было бы интересно сравнить. И еще интересно, как оно устроено в ObjectiveC++, где по идее должно как-то совмещаться?
Существуют ли штатные средства подключения и отключения методов к классам? (по идее это добавление и удаление записей из таблицы соответсивия селекторов функциям)
Можно ли «переключить» объект на другой «объект класса» (то есть переписать isa)?
Можно ли делать копии «объектов классов»?
Всегда считал, что синтаксическая эквивалентность имени массива и адреса первого элемента массива это баг языка. Да, может быть в простейших случаях и меньше на 1 символ писать, но последствия для стройности языка в целом неприятные.
Популярность языка Swift объяснима — у него есть практическое монетизируемое применение, разработка под iOS.
Они сделали интеграцию в IDE, связь с библиотеками, и все это «из коробки».
Go — это игрушка для программистов и воспринимается именно так. Если бы Гугл сделал Go заменой Java для разработки под Android — взлет популярности был бы не меньший.
Да я не против:) Просто интересно было как оно устроено, в том числе с точки зрения компилятора. Концепция мне очень нравится, но интересно, можно ли ее еще улучшить, можно ли интегрировать с другими языками программирования (включая альтернативные реализации динамики — виртуальные функции C++, сигналы-слоты Qt, интерфейсы Go). И как это можно было бы сделать в своем собственном языке программирования.
Получается, что ObjC хранит все имена всех методов в виде строк; и в основной реализации адреса этих строк и являются по сути селекторами (хотя формально это необязательно — достаточно чтобы было соответствие между текстовым именем метода и некоторым числовым идентификатором). Адреса строк — это самая простая, тупая и быстрая реализация такого соответствия.
А дальше, насколько я понимаю, строятся какие-то словари, в чем-то похожие на таблицы виртуальных функций, где ключ — селектор, а значение — адрес метода? Надеюсь, автор нам расскажет об этом в следующей статье:)
Отличаются в смысле самих числовых значений селекторов.
Вообще конечно это зависит от компилятора. Я смотрю на виртуалке Snow Leopard, там так. Попробовал сейчас на ideone.com — там иначе.
Идея следующая. Создаем objc-класс с парой методов.
int main()
{
c1 *obj1 = [[c1 alloc] init];
SEL s1 = @selector(meth1);
SEL s2 = @selector(meth2);
SEL s3 = @selector(methUnexist1);
SEL s4 = NSSelectorFromString(@"meth1");
SEL s5 = NSSelectorFromString(@"meth2");
SEL s6 = NSSelectorFromString(@"methUnexist2");
SEL s6 = NSSelectorFromString(init);
print_sel(s1);
print_sel(s2);
print_sel(s3);
print_sel(s4);
print_sel(s5);
print_sel(s6);
print_sel(s7);
return 0;
}
В результате имеем: s1 и s2 — селекторы существующих пользовательских методов; s3 — селектор несуществующего метода, но оформленный конструкцией языка selector; s4 и s5 — селекторы существующих пользовательских методов через функцию получения по строке (в рантайме); s6 — селектор несуществующего метода по строке в рантайме; s7 — селектор системного метода.
Вывод (Snow Leopard):
SEL 00000DEB = meth1
SEL 00000DF1 = meth2
SEL 00000E20 = methUnexist1
SEL 00000DEB = meth1
SEL 00000DF1 = meth2
SEL 0010FF60 = methUnexist2
SEL 816CD218 = init
Видим, что селекторы существующих методов (добавленные на этапе компиляции) совпадают для разных способов получения селектора (оператором @ selector или рантаймовой фукнкцией).
Селектор несуществующего нигде метода methUnexist1 располагается «рядом» с селекторами существующих методов. Возможно, из этого можно сделать вывод, что он также был добавлен в таблицу на этапе компиляции (т.к. @ selector — конструкция времени компиляции)?
Селектор несуществующего метода methUnexist2 уже отличается от остальных… такое впечатление, что он как раз был создан динамически и добавлен в таблицу уже в рантайме.
И наконец, селектор системного метода init вообще очень сильно отличается по значению. Интерпретировать это я уже не могу:)
Кстати, в примере с добавлением метода вместо
можно просто написать
будет warning, но все будет работать.
Для тех, у кого нет OSX и желания/возможности возиться с виртуалками, рекомендую www.tutorialspoint.com/compile_objective-c_online.php — там хоть и линукс, но с gnustep, что ближе к реальной макоси чем просто gcc (который тоже умеет компилировать objc).
Кстати, возникает вопрос — возможно ли прототипное ООП на objc, иными словами, можно ли добавить метод не в класс, а в объект; или сделать в рантайме копию объекта класса и использовать ее для некоторых объектов…
На расстоянии меньше метра бело-золотое, больше трех метров — сине-черное. Под углом тоже больше сине-черного.
Хотя яркость монитора и так на самом минимуме, не люблю когда светит в глаза.
Ну и традиционный вопрос — когда релиз?
Некоторые мысли (я не имею практического знания ObjC, но тема очень интересная, какие-то мысли приходят в голову...)
У каждого объекта класса есть скрытое поле с именем isa, которое указывает на специальный объект, описывающий класс в рантайме. Там, в этом объекте хранится по сути таблица соответствия селекторов и функций. Это похоже на таблицу виртуальных функций? Было бы интересно сравнить. И еще интересно, как оно устроено в ObjectiveC++, где по идее должно как-то совмещаться?
Существуют ли штатные средства подключения и отключения методов к классам? (по идее это добавление и удаление записей из таблицы соответсивия селекторов функциям)
Можно ли «переключить» объект на другой «объект класса» (то есть переписать isa)?
Можно ли делать копии «объектов классов»?
Они сделали интеграцию в IDE, связь с библиотеками, и все это «из коробки».
Go — это игрушка для программистов и воспринимается именно так. Если бы Гугл сделал Go заменой Java для разработки под Android — взлет популярности был бы не меньший.
Получается, что ObjC хранит все имена всех методов в виде строк; и в основной реализации адреса этих строк и являются по сути селекторами (хотя формально это необязательно — достаточно чтобы было соответствие между текстовым именем метода и некоторым числовым идентификатором). Адреса строк — это самая простая, тупая и быстрая реализация такого соответствия.
А дальше, насколько я понимаю, строятся какие-то словари, в чем-то похожие на таблицы виртуальных функций, где ключ — селектор, а значение — адрес метода? Надеюсь, автор нам расскажет об этом в следующей статье:)
следует читать
Вообще конечно это зависит от компилятора. Я смотрю на виртуалке Snow Leopard, там так. Попробовал сейчас на ideone.com — там иначе.
Идея следующая. Создаем objc-класс с парой методов.
Далее, фукнция печати селектора
И код main:
В результате имеем: s1 и s2 — селекторы существующих пользовательских методов; s3 — селектор несуществующего метода, но оформленный конструкцией языка selector; s4 и s5 — селекторы существующих пользовательских методов через функцию получения по строке (в рантайме); s6 — селектор несуществующего метода по строке в рантайме; s7 — селектор системного метода.
Вывод (Snow Leopard):
Видим, что селекторы существующих методов (добавленные на этапе компиляции) совпадают для разных способов получения селектора (оператором @ selector или рантаймовой фукнкцией).
Селектор несуществующего нигде метода methUnexist1 располагается «рядом» с селекторами существующих методов. Возможно, из этого можно сделать вывод, что он также был добавлен в таблицу на этапе компиляции (т.к. @ selector — конструкция времени компиляции)?
Селектор несуществующего метода methUnexist2 уже отличается от остальных… такое впечатление, что он как раз был создан динамически и добавлен в таблицу уже в рантайме.
И наконец, селектор системного метода init вообще очень сильно отличается по значению. Интерпретировать это я уже не могу:)