Обновить
63
1.3

Programmer

Отправить сообщение
Вижу как белый с «золотым» (который может быть и грязно бежевым и даже грязно-зеленым). Чтобы увидеть его хотя-бы слегка «сине-черным», пришлось сильно уменьшить картинку и прищуриться так, чтобы в глаза попадало гораздо очень мало света… тогда более светлый «белый» трансформируется в синий (потому что он и на самом деле не чисто белый, а более холодный, синеватый), а более темный «грязно-золотой» сообще перестает различаться как цвет и становится черным.
Хотя яркость монитора и так на самом минимуме, не люблю когда светит в глаза.
А зачем одноразовые телефоны могут быть вообще нужны? И сколько их нужно носить с собой человеку, который часто совершает звонки?
Вроде что-то с clang обещали?..
Ну и традиционный вопрос — когда релиз?
Можно было попробовать на спине закрепить камеры:) Может быть вы научились бы двигаться задом наперед.
Отнаследовать класс сразу от NSObject и от C++ класса с виртуальными функциями нельзя?
Огромное спасибо за продолжение, жду следующих статей!
Некоторые мысли (я не имею практического знания ObjC, но тема очень интересная, какие-то мысли приходят в голову...)
У каждого объекта класса есть скрытое поле с именем isa, которое указывает на специальный объект, описывающий класс в рантайме. Там, в этом объекте хранится по сути таблица соответствия селекторов и функций. Это похоже на таблицу виртуальных функций? Было бы интересно сравнить. И еще интересно, как оно устроено в ObjectiveC++, где по идее должно как-то совмещаться?
Существуют ли штатные средства подключения и отключения методов к классам? (по идее это добавление и удаление записей из таблицы соответсивия селекторов функциям)
Можно ли «переключить» объект на другой «объект класса» (то есть переписать isa)?
Можно ли делать копии «объектов классов»?
Всегда считал, что синтаксическая эквивалентность имени массива и адреса первого элемента массива это баг языка. Да, может быть в простейших случаях и меньше на 1 символ писать, но последствия для стройности языка в целом неприятные.
Популярность языка Swift объяснима — у него есть практическое монетизируемое применение, разработка под iOS.
Они сделали интеграцию в IDE, связь с библиотеками, и все это «из коробки».
Go — это игрушка для программистов и воспринимается именно так. Если бы Гугл сделал Go заменой Java для разработки под Android — взлет популярности был бы не меньший.
Да я не против:) Просто интересно было как оно устроено, в том числе с точки зрения компилятора. Концепция мне очень нравится, но интересно, можно ли ее еще улучшить, можно ли интегрировать с другими языками программирования (включая альтернативные реализации динамики — виртуальные функции C++, сигналы-слоты Qt, интерфейсы Go). И как это можно было бы сделать в своем собственном языке программирования.
Получается, что ObjC хранит все имена всех методов в виде строк; и в основной реализации адреса этих строк и являются по сути селекторами (хотя формально это необязательно — достаточно чтобы было соответствие между текстовым именем метода и некоторым числовым идентификатором). Адреса строк — это самая простая, тупая и быстрая реализация такого соответствия.
А дальше, насколько я понимаю, строятся какие-то словари, в чем-то похожие на таблицы виртуальных функций, где ключ — селектор, а значение — адрес метода? Надеюсь, автор нам расскажет об этом в следующей статье:)

опечатка, не успел исправить: вместо
SEL s6 = NSSelectorFromString(init);

следует читать
SEL s7 = @selector (init);
Отличаются в смысле самих числовых значений селекторов.
Вообще конечно это зависит от компилятора. Я смотрю на виртуалке Snow Leopard, там так. Попробовал сейчас на ideone.com — там иначе.
Идея следующая. Создаем objc-класс с парой методов.
@interface c1 : NSObject {}
- (int) meth1 : (int) arg;
- (int) meth2 : (int) arg;
@end

@implementation c1
- (int) meth1 : (int) arg { return arg+2; }
- (int) meth2 : (int) arg { return arg+20; }
@end


Далее, фукнция печати селектора
void print_sel(SEL s)
{
	printf("SEL %08X = %s\n", s, s);
}


И код main:
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 вообще очень сильно отличается по значению. Интерпретировать это я уже не могу:)
У меня нет никакой рекламы:) Наверное версия старая (3.1.2), но торренты качает нормально.
Отличная статья, надеюсь на продолжение! Язык действительно классный, несмотря на необычный синтаксис. Классный именно своими динамическими возможностями.
Я как-то смотрел исходники рантайма и проводил небольшие эксперименты, с похожей целью — выяснить как же работает этот механизм отправки сообщений. Селекторы, сформированные на этапе компиляции, имеют значения, сильно отличающиеся от селекторов этапа выполнения (видимо, это связано с тем, что существует две таблицы — статическая в секции константных данных и динамическая в куче).
Очень интересно, как селектор связывается с методом, сравнительный анализ этого с таблицами виртуальных функций (и можно ли эти два механизма объединить), реализация возможностей динамического добавления (и удаления?) методов из классов и т.д.
Полез искать что за «интернет»:) это мейлру чтоли? Прикольное название, заценил. И самое главное — удалять страшно! Вопрос винды будет «Вы действительно хотите удалить Интернет с вашего компьютера?».
Нужно еще сделать вьюер с названием «Все ваши фотографии», видеоплеер «Все фильмы» и редактор «Все документы».
В моих фантазиях я, конечно, думаю: еще было бы хорошо, чтобы человек в любой момент мог легко изменить поисковую систему по умолчанию.

Это правда, очень хорошо когда такая возможность есть. Чтобы изменить поисковик на стартовой странице Оперы на Гугл, пришлось залезть куда-то во внутренности браузера и поменять в конфигах нескольких местах «RU» на «US». Но удалось таки! А вот удастся ли это людям, далеким от IT?
Один из огромного множества вариантов. И скорее всего нереальный. Вы пытаетесь оценить будущее, используя ценности настоящего:)
Вот интересная ссылка — программа, имитирующая хакерский интерфейс из голливудских фильмов
Правда, там ИМХО реализовали далеко не все возможности (на опеннете как раз и обсуждали что еще там не хватает:) )
Интересно, есть еще подобные проекты?
А уж если объединить такую софтину с эмулятором старого терминала, который уже обсуждался здесь
Ну не знаю, galaxy s4 прекрасно пишет все разговоры официальным приложением galaxy call recorder.
Из статьи не понял, а как его включать/выключать?

Информация

В рейтинге
1 679-й
Зарегистрирован
Активность