С помощью lldb я хочу создать экземпляр класса Swift в моей динамической структуре сборки и выпуска iOS.
Я прикрепляю lldb к своей сборке выпуска на симуляторе.
Основное приложение - работает
(lldb) exp let $c = hello_class()
error: <EXPR>:3:10: error: use of unresolved identifier 'hello_class'
let $c = hello_class()
^~~~~~~~~~~
(lldb) expr import My_App
(lldb) exp let $c = hello_class()
(lldb) po $c.hello()
? hello ?
динамический каркас - не работает
(lldb) dclass -m myframework
Dumping classes
************************************************************
myframework.RustyAppInfo
(lldb) expr import myframework
(lldb) expr let $d = RustyAppInfo()
error: Couldn't lookup symbols:
__T011myframework12RustyAppInfoCACycfC
И приложение, и динамический фреймворк были созданы без оптимизации.
ОБНОВИТЬ
статическая структура - не работает
Те же результаты при переходе - на введенную функцию Xcode 9 - статическую структуру Swift.
Xcode - удаление мертвого кода
по умолчанию с кодом Swift Dead Code Stripping включен. Я проверил, не в этом ли проблема. Никакой разницы в результатах.
Этот символ: myframework.RustyAppInfo.__allocating_init() -> myframework.RustyAppInfo. Это кажется разумным вызовом при создании нового объекта, но я не уверен, почему его нет в вашем фреймворке.
Мне не удалось объявить функцию инициализации моей Framework как общедоступную @JimIngham. Это было причиной того, что не удалось найти символ.





РЕШЕНО
Я нашел свой ответ в этой статье:
Мне не удалось установить public init() в классе Swift, который находился внутри Framework. Рабочий код, который может быть вызван lldb:
// set the Framework class to Public
public class rnHello{
// set the initializer to public, otherwise you cannot invoke class
public init() {
}
// set the function to public, as it defaults to internal
public static func world() {
print("hello from a static method")
}
}
Теперь вы можете получить к нему доступ через свой Swift-код или с помощью lldb:
(lldb) po rnHello.world()
hello from a static method
Обратите внимание, проблема заключалась не в том, что метод был частным сам по себе. Анализатор выражений lldb может вызывать методы независимо от того, являются они общедоступными или частными. Проблема заключалась в том, что, поскольку init не был общедоступным, компилятор знал, что он может рассуждать обо всех его применениях, и поэтому ему не нужно было генерировать неиспользуемые ароматы, включая тот, который ему нужен для создания объекта из lldb. Когда вы делаете init общедоступным, swift больше не может рассуждать о его использовании, а вместо этого должен выдавать все, что может быть вызвано.
Интересно! Может быть, отредактируйте вопрос, чтобы он содержал «из фреймворка при подключении его в отладчике» или так, чтобы быть более конкретным и, надеюсь, привлечь специалистов :)