我會在這裏告誡:您描述的特定情況可能不應該這樣做。這幾乎肯定是過於聰明,應該分爲viewDidLoad
和viewWillAppear
而不是viewWillAppear
的兩個版本。這就是說,問題出現了。
我的首選解決方案是保留一個SEL
指向我想要做的事情。舉例來說,我使用這種技術的一個複雜的異步活動後,「下一步行動」:
if (self.nextActionSelector != NULL)
{
[self performSelector:self.nextActionSelector];
}
因此,對於這一點,你可以使用一個viewWillAppearSelector
會隨時間而改變,並且viewWillAppear
只會叫什麼它指向。
Ben對Method Swizzling的建議在某些情況下很有用,但更多的時候當您試圖修改某些現有對象而不是您自己的行爲時。它確實可以使調試變得有趣......好吧,實際上並不好玩。痛苦。很痛苦。
除此之外,我會看看-forwardInvocation:
,它可以用來響應你不直接實現的消息。然後,您可以重寫調用以調用您真正想要的方法。不過,這並不是真正意義上的使用方式。它用於透明地將呼叫轉接到其他對象。但至少調試它並不困難,因爲調試器會按照您的預期進行調試。
通常在這種情況下,而不是一個布爾值,我尋找我以前運行過的證據。檢查view
是否已經設置,或者是第一次初始化的其他值,所以我不需要一個特殊的變量,所以我很容易清理我的狀態(就像iPhone在內存緊張時傾倒東西的做法) 。在可能的情況下,我會讓這些東西在他們的吸氣者中自行初始化,而不是讓一些外部派對擁有特殊的首次邏輯。保持這裏的邏輯簡單,使得維護更容易,嘿,NSInvocation
是瘋狂的 - 慢(好吧,你不會注意到它,除了在一個緊密的循環中,但它比我的測試中的方法調用慢大約500倍,我並不是建議在性能,可維護性方面做出這個決定)。
對於不是單例的任何類,這是非常有問題的,因爲方法查找表是按類而不是實例,所以任何混合將應用於類的每個實例。 – Chuck 2009-06-15 18:01:20