基本上,您可以在有意義時創建,添加和移除手勢識別器。而「何時有意義」取決於一些事情,但通常只是關於你是否將他們保留爲Ivars。與ARC
關鍵是管理強大的參考;有ARC
ivars默認情況下很強大。
因此,我們假設您添加了一個水龍頭識別器。在這種情況下,您不需要再次訪問識別器。謹以此創建:
-(void)viewDidLoad{
[super viewDidLoad];
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];
[self.view addGestureRecognizer:tap];
}
有了這個方案,需要別的什麼也不做來管理這個識別器。這個觀點系統對它有很強的參考。你所要做的就是坐下來等待它的電話號碼handleTap:
。當視圖卸載時,此抽頭識別器將被釋放。
由於不難想象會導致創建多個識別器的一系列事件,所以此場景也不太適合在viewWillAppear:
中添加此識別器。
因此,從邏輯上講,如果你想在外觀方法中添加一個識別器,你將不得不在伊娃中持有某種引用。但是,這並不總是一個壞主意。一般來說,您希望參考您的識別器的原因是爲了幫助<UIGestureRecognizerDelegate>
方法的邏輯(如果使用的話)。
我個人絕不會在initWith..
方法中添加識別器以便以後進行附件。唯一的優點是你在那裏創建的任何識別器都會被保留在視圖控制器的整個生命週期中。但是,由於識別器很明顯是視圖系統的一部分,所以這種混亂 - 可可重點在於MVC
。同樣在內存不足的情況下,導航堆棧上的控制器視圖被清除,但在這種情況下,識別器可能仍然使用內存(並非那些巨大的對象),這並不是真正的原因。
您當然可以在view(Will/Did)Appear:
方法中添加識別器,並在view(Will/Did)Disappear:
中將其刪除。不是我的偏好。我不認爲這只是因爲modal
視圖被呈現和刪除,或導航push
/pop
發生了,我應該刪除並重新添加我的識別器。
我會推薦幾乎總是使用viewDidLoad
實例化並附加您的識別器。請記住在viewDidUnload
中剔除對它們的強烈引用,以幫助解決低內存情況。再次與ARC
有沒有必要在dealloc中與ivars做任何事情。
我已經瀏覽過,但沒有找到我的問題的答案。 – mrd3650 2012-04-11 11:01:22
@TheLion:「對不起,找不到那個頁面。」 – Colas 2015-05-03 14:26:40
對不起蘋果已經改變了它[這裏](https://developer.apple.com/library/ios/documentation/EventHandling/Conceptual/EventHandlingiPhoneOS/GestureRecognizer_basics/GestureRecognizer_basics.html)它是同一資源的新網址。謝謝指出@Colas – 2015-05-14 09:31:53