2013-11-27 2 views
0

Я хотел бы сохранить блок объектива-c в файл (или любое другое хранилище, например FTP-сервер), а затем загрузить его оттуда и выполнить его.Можно ли сохранить объект-c-блок в файл, а затем прочитать его оттуда, чтобы его использовать?

От Blocks Programming Guide > Using Blocks > Copying Blocks, я знаю, что блоки могут храниться в куче. Поскольку все, что хранится там, может быть изменено, я думаю, что можно читать и записывать произвольный контент из/в кучу и обрабатывать данные как блок.

Моя проблема заключается в том, как сохранить блок в файл? Я даже не знаю, какова его структура/сколько байтов она покрывает. Я очень сомневаюсь, что делать sizeof(), а затем читать/записывать столько байтов. Пожалуйста, помогите мне найти начало чтения и записи блоков в/из памяти и понять, как они состоят.

Начнет с этим кода:

void (^myBlock)(void) = ^{ printf("Hello, I'm a Block\n"); };  
printf("block size: %lu\n", sizeof(myBlock)); 
myBlock(); 

Выход:

block size: 4 
Hello, I'm a Block 

Как вы можете себе представить, если это работает, длинный список увлекательных концепций может быть реализован в прошивке. Просто назвать несколько:

  • Загрузка исполняемого кода (в качестве блока) из Интернета на лету, хранить его в куче, и выполняя его, таким образом, делая динамически связанные библиотеки возможно в прошивкой. Из этой идеи появляется много возможностей, которые просто слишком много, чтобы писать здесь.
  • Компиляция кода в приложении и его немедленное выполнение, что позволяет использовать любые языки сценариев в приложениях iOS.
  • Манипулирование кодом во время выполнения на уровне машины в iOS. Это важная тема для ИИ и эволюционных/случайных алгоритмов.

ответ

0

Невозможно: При копировании блока в кучу вы копируете адрес самого блока, а не код блока. Кроме того, возможность запускать не скомпилированный и подписанный код противоречит концепции песочницы, и она откроет возможность запуска злого кода в приложении, нарушающего безопасность. Вы можете реализовать пользовательский интерпретатор языка в своем приложении, чтобы запустить интерпретируемый код, но это было бы против политики Apple, и оно было бы отклонено во время процесса проверки.

+0

Вы правы, исполняемый код остается в области кода ОЗУ, и попытка изменить его приводит к EXC_BAD_ACCESS.Только параметры блока передаются в области доступной записи. –

2

A объект блока может храниться в куче. Но сам объект блока, как и другие объекты, не содержит исполняемого кода - он содержит только захваченные переменные, некоторые метаданные и указатель на исполняемую функцию. Даже если вы могли гипотетически сериализовать блочные объекты, вы могли бы только их не инициализировать в системе, которая реализовала тот же блок, то есть имеет тот же исполняемый код.

Чтобы сделать аналогию, то, что вы говорите, в равной степени относится к нормальному объекту Objective-C - объекты Objective-C существуют в куче, вы можете сериализовать множество объектов Objective-C, а объекты Objective-C содержат исполняемый файл " методы ", которые вы можете вызвать на них. Означает ли это, что вы можете «загружать исполняемый код (как объект) из Интернета« на лету », хранить его в куче и вызывать методы на нем, что делает возможным использование динамически связанных библиотек в iOS».? Конечно нет. Вы можете потенциально не инициализировать объекты в системе, имеющей один и тот же класс.

Смежные вопросы