2013-08-19 24 views
0

我在iOS應用程序中有一些粉碎。經過調查,我發現問題是一些懸掛指針。要找到它來自哪裏我已經開始使用「殭屍」跟蹤模板在模擬器(iOS 6.1)上分析代碼。故事板修改後的殭屍對象的Objective-C發佈

測試場景很簡單:選擇桌面上的某個項目,然後通過調用名稱的正確方式移動到下一個控制器,然後按回退按鈕。當「返回」動畫完成時出現粉碎。

這裏是表格形式探查與殭屍公佈的數據對象(我刪除無趣列,如:#;分類 - 總是相等的CALayer;時間戳):

Event Type RefCt Size Responsible Library Responsible Caller 
Malloc  1  48  UIKit    -[UIView _createLayerWithFrame:] 
Retain  3  0  QuartzCore   CA::Layer::insert_sublayer(CA::Transaction*, CALayer*, unsigned long) 
Release  2  0  UIKit    -[UIView(Internal) _addSubview:positioned:relativeTo:] 
Retain  3  0  QuartzCore   -[CALayerArray mutableCopyWithZone:] 
Release  2  0  UIKit    -[UIView(Hierarchy) bringSubviewToFront:] 
Retain  3  0  QuartzCore   -[CALayerArray copyWithZone:] 
Release  2  0  UIKit    -[UIView(Hierarchy) _makeSubtreePerformSelector:withObject:withObject:copySublayers:] 
Retain  3  0  QuartzCore   -[CALayerArray copyWithZone:] 
Release  2  0  UIKit    -[UIView(Internal) _didMoveFromWindow:toWindow:] 
Retain  2  0  QuartzCore   -[CALayerArray copyWithZone:] 
Release  1  0  UIKit    -[UIView(Hierarchy) _makeSubtreePerformSelector:withObject:withObject:copySublayers:] 
Retain  3  0  QuartzCore   -[CALayerArray copyWithZone:] 
Release  2  0  UIKit    -[UIView(Internal) _didMoveFromWindow:toWindow:] 
Retain  3  0  QuartzCore   -[CALayerArray copyWithZone:] 
Release  2  0  UIKit    -[UIView dealloc] 
Release  1  0  UIKit    -[UIView dealloc] 
Zombie  -1  0  QuartzCore   CA::release_objects(X::List<void const*>*) 

現在這個表不指向任何地方,以我的代碼,所有條目都與系統庫相關:UIKit或QuartzCore。所以我不能顯示我的代碼,因爲我不知道哪個部分是錯誤的,並且有很多。

當我嘗試查看更改歷史記錄時,首先提交此問題的唯一重大更改是故事板中的更改。 這很奇怪,因爲故事板的變化不應該有這樣的問題。我無法說出究竟發生了什麼變化(故事板XML非常難以閱讀)。

任何建議如何找到/解決這個問題?或者也許有人有類似的問題?

+0

你在'viewDidAppear'方法中有一些代碼嗎? –

+0

在表格控制器中的'viewDidAppear'只包含其他任何東西(除了[[super viewDidAppear:animated]'當然除外] –

+0

在另一個控制器中我沒有'viewDidAppear'或'viewDidDisappear' –

回答

1

我很懷疑:

Release  2  0  UIKit    -[UIView dealloc] 
Release  1  0  UIKit    -[UIView dealloc] 

什麼是這些調用的調用堆棧?

過去,我在-dealloc中發佈了屬性不當引起的問題。只是可以肯定的是,我在-dealloc發佈它們之後封印了指針。

[_prop release]; _prop = nil; 
+0

很難說這些條目的調用堆棧是什麼,我確實找到了任何選項探查器獲取此信息。 –

+1

@MarekR如果突出顯示該行,則可以顯示「擴展詳細信息」視圖,該視圖是視圖分段控件的最右側。 「擴展細節」具有調用堆棧。 –

+0

謝謝!我仍然熟悉XCode工具。令人驚訝的是,當我查看所有條目的調用堆棧時,它不允許找到問題的根源。 –

0

最後我發現了這個問題。

問題是由錯誤合併引起的,對於某些IBOutlet屬性release方法在控制器釋放時被調用了兩次。這些調用被其他屬性的其他發佈請求分開,因此很容易錯過。問題出現在生產代碼中,但由於它位於根視圖控制器中(因此它的運行時間與應用程序一樣長),因此並未提前出現。 (我繼承了這樣的「精彩」代碼)

現在我有了新的UI規範和控制器的變化順序,有問題的控制器不再是視圖控制器堆棧中的第一個,因此它得到釋放並且bug開始顯示它自。

我浪費了兩個工作日來找到這:)。

感謝您:「Jeffery Thomas」和「Bernd Rabe」,您的反饋讓我發現問題所在。

有趣的是,XCode工具:「產品/分析」沒有檢測到這一點。絕對應該。
另外Profiler在跟蹤殭屍應該抱怨作爲問題的根源的對象時,現在它抱怨有問題的對象的孩子。簡單的殭屍異常應該在dealloc沒有被調用之前升級。