2010-03-09 3 views
0

Мне было интересно, знает ли кто-нибудь, как iSimulate автоматически регистрирует/перехватывает себя в отладочное приложение iDevice? Это так же просто, как включение статической библиотеки (и нескольких фреймворков), и она просто работает. Для вызова нет методов или функций. Как это возможно?iSimulate Автоматические крюки

ответ

1

Короткий ответ: используя категории в Objective-C, вы можете расширить или расширить любой класс в системе, включая основные классы и сам NSObject. (Подобно «патчу обезьян» в Ruby, например.)

Фактическое сообщение, скорее всего, является широковещательной передачей, отправляющей пакеты, которые не ожидают ответа. Когда вы запускаете свое приложение, оно просто начинает перехватывать эти пакеты. Таким образом, приложение-симулятор подключается к потоку iSimulate, а не iSimulate каким-то образом «достигает» вашего приложения.

Посмотрите на источник с открытым исходным кодом accelerometer simulator проект. Вы также можете легко распространить его на трансляцию, и в основном дублировать то, что делает iSimulate. И вы узнаете о отличной стороне Objective-C.

+0

Я не знал об этом проекте, но это удобно знать. Я действительно люблю Objective-C и Ruby за их способность переопределять/расширять существующую реализацию. Это не решение, из которого я был оригинальным, но это дает мне представление о другой проблеме, которую я испытывал :) Я думаю, что нашел решение, используя функцию инициализации (INIT_ROUTINE в XCode) компоновщика, через Mach-O Ссылка на формат файла ABI. Я собираюсь дать вихрь. – pryomoax

+0

Ok, INIT_ROUTINE предназначен только для динамических библиотек, которые, как мы знаем, не могут быть созданы для приложений iPhone - Grrr! – pryomoax

+0

'__attribute __ ((constructor)) static void MyInit() {doSomething(); } 'работает, как и добавляет к классам метод' + load' или '+ initialize'. – rpetrich