我正在將一些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.
我做了這個錯誤?
嗯..我試圖做到這一點,但我的執行情況稍有不同。這個解決方案導致我的電腦在模擬器中執行時凍結。也許忽略寫內存管理例程是我出錯的地方。 – 2012-03-08 14:31:39
即使是來自蘋果的人不喜歡「官方」單身實施:http://stackoverflow.com/a/5720476/852828 – jrturton 2012-03-08 15:40:46
他們可能不喜歡它,但這並不意味着它不會工作。嘗試完全按照他們的方式進行實施,看看它是否有效。 – sosborn 2012-03-08 23:16:19