Когда вы делаете что-то вроде:
[[ClassName alloc] init]
На самом деле вы отправляете сообщение alloc
в метакласс ClassName
, а затем init
в экземпляр ClassName
, которыйметакласс пытается вернуться (или никому, если метакласс вернул nil
из-за недостатка ресурсов).
Кроме того, среда выполнения Objective C является отражающей.Среди прочего, это означает, что вы можете запросить его, чтобы найти метаклассы из строкового имени классов.Например,
Class metaclass = NSClassFromString(@"ClassName");
, который возвращает либо названный метакласс, либо nil
, если этот класс не существует.Сложив это вместе:
id instance = [[NSClassFromString(@"ClassName") alloc] init];
Даст вам экземпляр класса, если такой класс известен приложению и доступны подходящие ресурсы.Поэтому в случае необязательных библиотек ссылок это способ попытаться получить экземпляр класса, но безопасно завершить его, если библиотека, содержащая этот класс, не была связана.