2014-03-13 64 views
1

最近,我一直在對應用程序的樂器進行一些性能分析。這是我注意到:爲什麼UIButton框架設置太慢

pic1 pic2

即在UIButton的邊框設置是很慢的。

要(從int到CGFloat的)排除它是類型轉換引起的概率,我曾嘗試以下:

pic3

我也曾嘗試:

pic4

不,也沒有太大的幫助。

最後但並非最不重要我已經確定它是不是由CGRectMake:

pic5

的函數被調用大約650-670倍,這使得每一幀設置通話大約0.173ms?這聽起來是對的嗎?我怎麼能改善表現?

回答

1

嗯......我不是100%確定的,但是您使用的按鈕類型爲UIButtonTypeDetailDisclosure,它有一個固定的大小。

試着設置它的中心而不是框架。

myDetailButton.center = CGPointMake(12, 12); 

的,而不是...

myDetailButton.frame = CGRectMake(0, 0, 23, 23); 

另外,f不是必需的,它IIRC使用時,實際上可以採取更多的內存。只需使用2323.0而不是23.0f。我必須爲此找到一個參考。

編輯

說了這麼多我只是看到你的時間統計在問題的底部。

你在這裏看到的百分比是相對的。 0.173毫秒幾乎沒有時間。

通過不多次運行該功能,您可能會獲得更好的性能提升。你正在運行700次。好多啊!你真的需要多次運行它嗎?你甚至無法一次將那麼多按鈕放到屏幕上。

也許你需要將它們出列嗎?畢竟你使用的是MKMapView

+0

你是什麼意思將他們出列? –

+0

嗯,我需要看到更多的代碼來確定你想要用按鈕做什麼。 tableView和collection視圖管理單元格的方式與地圖管理註釋視圖的方式相同。如果一個表有100個項目,但只有10個在屏幕上,那麼它只會創建10個單元格。然後,當一個單元格離開屏幕時,該單元格被再次標記爲可用於下一個項目,因此只有10個單元格。這樣做是有道理的,而不是將700個按鈕加載到內存中。只有足夠的顯示在屏幕上並重新使用它們。 – Fogmeister

+0

非常感謝您的幫助,但它有點難,因爲服務器在第一次查詢時返回了600多個結果,所以除非更改查詢的處理方式,否則無法輕鬆解決。 –