2010-09-23 53 views
0

我試圖訪問UITextView的代表和有問題UITextView的代表問題

我與UITextViewDelegate協議和包含TextView的筆尖一個UIViewController。

如果我在viewDidLoad裏面設置了像「textView.delegate = self」這樣的委託,並且我觸摸了textView,那麼應用程序崩潰而沒有記錄錯誤。 如果我用像「[textView becomeFirstResponder]」這樣的代碼開始編輯textView,所有代表都會被調用。

當我在Nib中設置委託在textView和文件所有者之間創建連接並刪除「textView.delegate = self」時,也沒有委託被調用。

我在這裏做錯了什麼?

問候,

埃利亞斯

+0

你確定「文件所有者」是正確的文件嗎?另外,你在調用什麼代理方法?請張貼一些代碼。 – MishieMoo 2010-09-23 14:26:30

回答

4

這並不容易,以幫助您沒有更多的說明,張貼代碼或XIB文件。

你說應用程序崩潰沒有任何記錄錯誤 - 嗯,你的意思是控制檯的窗口沒有輸出?對於已崩潰的應用程序,這很正常。

無論如何,你應該能夠獲得堆棧跟蹤來確定應用程序崩潰的位置。打開調試器(⇧⌘Y),並查看位置。這應該讓你知道哪裏出了問題。

在這裏你可以看到這樣的調試程序會話(後EXC_BAD_CRASH)爲例:

alt text

前兩行並沒有給我們太多的信息,但後來我們可以看到應用程序崩潰,而從NIB文件加載用戶界面。那麼,通常在這種加載過程中執行的唯一代碼是awakeFromNib方法 - 您應該根據這些方法找到問題。

通常情況下,代碼的執行沒有任何意義 - 例如,您可能會在某處看到您的ViewController方法,但前幾個函數調用(代碼崩潰的那些)位於您從不調用的方法/類中你的代碼。在大多數情況下,這是內存釋放/分配錯誤的跡象。可能發生的事情是,你忘記了一些你的對象,它已經被釋放,但你仍然保持對其內存的引用(一個指針)。因爲這個記憶實際上已經被釋放了,所以後面的另一個對象就取代了它的位置,通常是一些你從未聽說過的蘋果內部物體。稍後,您的代碼嘗試向您的可憐對象發送消息,但它會向完全不同的消息發送消息。無賴!這就是你如何得到這些崩潰和奇怪的堆棧痕跡。

要解決我剛纔描述的問題,可以使用樂器及其殭屍樂器。不幸的是,你不能從Xcode中啓動殭屍,你需要單獨啓動樂器,然後從工具欄中選擇iPhone Simulator/Memory,然後Choose Target下的殭屍,你應該看到你的應用程序,或者能夠在文件系統上導航到它。

殭屍工具的功能在於,它在釋放對象後從未真正釋放內存。相反,它會將這些對象變爲NSZombie類。該類攔截所有對自身的調用,並在某些代碼嘗試向其發送消息時通知您。

這是會議儀器怎麼這麼樣子(這是出現在調試器上面相同的崩潰):

alt text

在表中可以看到,我們正在努力有消息的UIScrollView已被釋放。您還可以看到對這個特定對象的保留/釋放調用的整個歷史記錄。這樣你可以找到一個失蹤的保留或錯誤的釋放/ autorelease。

記住 - 殭屍工具只能用於模擬器,因爲在真實設備上沒有足夠的內存來保存所有這些內存塊。

希望我可以幫助您進一步分析您的問題。