如果您確實需要修改AppDelegate
而完全不需要開發人員的任何干預,並且您可以修改xcodeproj和nib而不是源代碼,那麼有一種方法可以實現。
首先,確保你的類被編譯進去,並且你的類的一個實例被創建在nib中。
現在,這裏就是你要做的:
- 定義
-[AHHackClass applicationDidFinishLaunching]
方法,做你的額外的東西,然後調用[self originalApplicationDidFinishLaunching]
。
- 在
-[AHHackClass awakeFromNib:]
中,使用objc運行時調用將-[AHHackClass applicationDidFinishLaunching]
方法複製到應用程序委託爲-[originalApplicationDidFinishLaunching]
,然後使用方法調換來交換兩個方法的實現。
- 做同樣的swizzle
applicationWillTerminate
。
請參閱JRSwizzle
瞭解一些使該方法變得更容易的代碼,以及MethodSwizzling
at CocoaDev的某些背景。
但是,可能有一個更簡單的方法來做到這一點:是否真的需要從應用程序代理的applicationDidFinishLaunching
和applicationWillTerminate
方法中調用額外的東西?難道你不能只在你的awakeFromNib
中收聽通知並在那裏處理事情嗎?
如果出於某種原因,你不能這樣做,你可以在開發者的指示中放一行,從applicationDidFinishLaunching
方法中調用你的方法嗎?
我不清楚你想做什麼。首先,如果您使用PyObjC添加子類或類別,那就是PyObjC代碼,而不是ObjC代碼,所以它不會影響iOS應用程序,除非您實際分發一個加載本機應用程序並實時修改它的PyObjC包裝應用程序(除非您嘗試通過MobileSubstrate爲越獄手機執行此操作,在這種情況下,您可能可以從外部注入您的更改)。 – abarnert 2013-02-14 20:41:58
對不起,澄清,它是一個iOS obj-c項目。我正在編寫安裝程序在Python中,它將修改源代碼(作爲文本)。 – 2013-02-14 20:43:10
如果您試圖爲子類添加源代碼,那是一個不同的故事。你可以做到這一點,但是你需要改變他們的xcodeproj/makefile /任何來構建你的新源代碼,並且你還需要改變他們的源代碼或者nib來加載你的子類而不是基類,然後你回到「解析源代碼」。 – abarnert 2013-02-14 20:43:11