2012-01-29 44 views
0

我目前正在開發一款管理飛機機隊的iPad應用程序。我想使用NSXMLParser讀取XML文件中的數據,該文件創建包含數據的「Airplane」實例。 NSXMLParser以及NSXMLParserDelegate是App Delegate的子代。我正在使用一個選項卡視圖佈局。解析本身工作得很好。一個包含Aircraft對象的NSMutableArray被傳遞給選項卡視圖控制器。問題在於,從Tab View Controller中,無法訪問「Airplane」對象的屬性,導致出現「EXC_BAD_ACCESS」警告。但是,從App Delegate類訪問時,它工作得很好。這是委託類的屬性定義:EXC_BAD_ACCESS數據通過後

@property (copy, readonly) NSMutableArray* airplanes; 

它被傳遞到視圖控制器是這樣的:

fleetViewController.airplanes = delegate.airplanes; 

屬性定義在fleetViewController:

@property (copy, readwrite) NSMutableArray *airplanes; 

而且這是拋出異常的部分:

registration = [[airplanes objectAtIndex:0] registration]; 

正如我所說,當從App Delegate調用同樣的方法時,它可以毫無困難地工作。如果您正在使用性能

幫助是極大的讚賞

回答

2

,你應該使用self.propertyName符號總是設置自己的價值。這確保了內部的內存管理是正確的。

如果您有EXC_BAD_ACCESS這意味着您正在訪問無效的內存。爲了解決這樣的問題,它是在檔案模式下運行應用程序,並檢查「植物大戰殭屍」非常有幫助:

我覺得這種另類更方便:

  1. 點擊「運行按鈕下拉」
  2. 從列表中選擇Profile
  3. 程序「儀器」應該開在這裏你還可以選擇Zombies
  4. 現在你可以用你的應用程序進行交互,並嘗試導致錯誤
  5. 只要發生錯誤,您應該知道對象何時被釋放並因此釋放。

Zombies http://www.dimzzy.com/blog/wp-content/uploads/2011/02/leaky-zombies-tool.png

+1

儘管這是事實,你應該避免在initialisers和dealloc的使用'self.'。 – Abizern 2012-01-29 13:49:30

+0

嗯..不知怎的,我的樂器似乎不能正常工作,當我在「配置文件」模式下運行時,錯誤不能被重現,而是什麼也沒有發生,現在對象甚至沒有傳遞。 – Mathis 2012-01-29 13:55:47

+0

更新:我注意到我有Airplanes類中的屬性設置爲「複製」。由於實際上並不需要我將它改爲「保留」,並帶來令人驚訝的結果:現在錯誤不再以常規方式發生,它彈出遍及整個代碼,永遠不會在同一個地點兩次行。有時候根本沒有錯誤發生,大約有一半的NSString被返回。例如,一架飛機的註冊爲「HB-CHX」,並返回「HB-C」。我迄今爲止最奇怪的是「German.lproj」被返回。這對我沒有意義..任何人? – Mathis 2012-01-29 14:30:08