2012-03-08 55 views
0

我正在將一些iOS3代碼移植到iOS5。最初我使用一個單例作爲全局數據存儲。它提供了我需要通過視圖控制器訪問的任何數據的單個實例,並且主要是從我從服務器獲取的數據中填充的。將iOS3代碼移植到iOS5:單身人士的問題

在iOS3版本中,我爲我的數據存儲使用了Matt Gallagher的singleton implementation。但是,對於iOS5,我想使用ARC,因此我轉移到了Luke Redpath的GCD implementation

現在我遇到了一些拉取服務器數據的代碼。在單例init函數中,我嘗試通過輪詢我的服務器來填充單例。服務器通信由獨立的類來處理。通信類使用存儲在單例中的憑證數據,這似乎是我遇到麻煩的地方。單步執行代碼時,當我點擊訪問單例的代碼行時,服務器com例程會退出。沒有錯誤,沒有警告,程序在碰到單身存取線時就會退出。

單身人士在其他地方工作正常,所以我認爲這與單身人士的循環引用有關(單身人士實例化試圖訪問單身人士的服務器類別)。

在這一點上,我不知道如何繼續。我寧願不重組我的代碼的端口。關於a)我的問題可能是什麼以及b)創建單個全局可訪問的服務器數據實例的其他選擇的任何建議?

EDITED

利用蘋果公司的singleton design pattern,通過sosborn的建議,會導致代碼在我單身的初始化程序如下塊的問題。

// enable the location controller 
locationController = [[LocationController alloc] init]; 
locationController.delegate = self; 
[locationController.locationManager startUpdatingLocation];

在最後一行我得到一個EXC_BAD_ACCESS

warning: Unable to restore previously selected frame.

我想這是一個內存管理問題。基於Apple的文檔,我沒有重寫任何內存管理例程。

If you want a singleton instance (created and controlled by the class factory method) but also have the ability to create other instances as needed through allocation and initialization, do not override allocWithZone: and the other methods following it as shown in Listing 2-15.

我做了這個錯誤?

回答

0

我永遠無法完全解決此問題。我最終決定使用更新的基於塊的HTTP請求方法重構應用程序。

0

爲什麼不使用蘋果的recommended code for singletons

+0

嗯..我試圖做到這一點,但我的執行情況稍有不同。這個解決方案導致我的電腦在模擬器中執行時凍結。也許忽略寫內存管理例程是我出錯的地方。 – 2012-03-08 14:31:39

+0

即使是來自蘋果的人不喜歡「官方」單身實施:http://stackoverflow.com/a/5720476/852828 – jrturton 2012-03-08 15:40:46

+0

他們可能不喜歡它,但這並不意味着它不會工作。嘗試完全按照他們的方式進行實施,看看它是否有效。 – sosborn 2012-03-08 23:16:19

0

確實聽起來像單身人士班及其屬性尚未完全準備好,當你打電話給他們。

你提到在init方法中做了很多網絡的東西。當你打電話時,有沒有機會讓對象沒有處於完全就緒狀態?

如果您在安全使用某個對象之前需要完成一個漫長的過程,則可以查看使用通知或委託模式在事情準備就緒時運行下一步。

對於沒有警告的進程炸彈的情況,請嘗試使用NSZombies來協助進行調試。