Я собираюсь взять на себя большинство вещей, которые отсутствуют в вашем вопросе. Его отличная идея всегда ставить вопросы с образцами кода, когда это возможно.
Вы должны убедиться, что вы swizzling ваши методы по конкретной реализации UIApplicationDelegate, а не самого UIApplicationDelegate. Например:
@interface AppDelegate : UIResponder <UIApplicationDelegate>
@end
В этом случае вам необходимо подкачать класс AppDelegate.
Также, если вы пытаетесь написать статическую библиотеку/фреймворк, вы можете вообще не знать имя этого класса. В таких случаях простейшим/безопасным способом является запрос имени AppDelegate App и его использование для извлечения определенного экземпляра класса через NSClassFromString(), или вы можете просто использовать команду для поиска нужного вам класса (поскольку обычно у вас есть класс Single AppDelegate).
unsigned int numberOfClasses = 0;
Class *classes = objc_copyClassList(&numberOfClasses);
Class appDelegateClass = nil;
for (unsigned int i = 0; i < numberOfClasses; ++i) {
if (class_conformsToProtocol(classes[i], @protocol(UIApplicationDelegate))) {
appDelegateClass = classes[i];
}
}
EDIT
Есть несколько недостатков вышеуказанного подхода,
Он перебирает все классы, доступные по коде приложения, пробегают по всем эти классы не являются эффективным решением.
Многие известные SDK будут изучать или динамически расширять ваш AppDelegate
, потому что в этом одном месте может быть перехвачено много интересного. Это также означает, что ваше приложение может иметь более одной версии протокола UIApplicationDelegate
, а приведенный выше код может просто выбрать любую его реализацию, что вызовет некоторые серьезные проблемы.
Как Крис предложил в комментариях ниже, его гораздо более безопасный и производительный просто использовать [[UIApplication sharedApplication].delegate class]
. который должен дать вам точную реализацию AppDelegate, известную приложению iOS, в момент вызова этой строки кода.
Я не думаю, что Apple любит вас, выполняя свои API-интерфейсы: http://stackoverflow.com/questions/7720947/method-swizzling-in-ios-5 –
По определению у вас есть реализация делегата приложения в вашем собственное приложение, поэтому swizzling не нужно. Теперь, если вы говорите о swizzling ** реализации другого приложения **, то нет, вы не можете этого сделать. – bbum
Не имеет смысла подмешать метод в классе, который вы определяете. Если вам не нужен код в делегате приложения, поместите его другим способом, который вы вызываете оттуда, или отправьте уведомление, которое получит какой-либо другой объект. –