将iOS3代码移植到iOS5:单身人士的麻烦

时间:2012-03-08 03:53:24

标签: objective-c ios ios5 singleton global-variables

我正在将一些iOS3代码移植到iOS5。最初我使用单例来表示全局数据存储。它提供了我需要跨视图控制器访问的任何数据的单个实例,并且主要填充了我从服务器提取的数据。

在iOS3版本中,我使用Matt Gallagher的singleton implementation作为我的数据存储。但是,对于iOS5,我想使用ARC,所以我转移到了Luke Redpath的GCD implementation

现在我遇到了一些提取服务器数据的代码。在单例初始化函数中,我尝试通过轮询我的服务器来填充单例。服务器通信由单独的类处理。通信类使用存储在单例中的凭证数据,这似乎是我遇到麻烦的地方。单步执行代码,当我点击访问单例的代码行时,我的服务器com例程退出。没有错误,没有警告,例程只是在它到达单件访问线时退出。

单例在其他地方正常工作,所以我认为这与单例的循环引用有关(单例实例化试图访问单例的服务器类)。

此时我不知道该怎么办。我宁愿不重构我的端口代码。关于a)我的问题可能是什么以及b)创建单一的,全局可访问的服务器数据实例的其他替代方案的任何建议?

EDITED

正如索索恩所建议的那样,使用Apple的singleton design pattern会导致我的单身人士的init例程中的以下代码块出现问题。

// 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.

我做错了吗?

3 个答案:

答案 0 :(得分:0)

为什么不使用Apple的recommended code for singletons

答案 1 :(得分:0)

当然,听起来像单身人士的类,当你打电话时,它的属性还没有完全准备就绪。

你提到在init方法中做了很多网络工作。你打电话时对象是否有可能没有处于完全就绪状态?

如果在安全使用对象之前有一个漫长的过程需要完成,那么当事情准备就绪时,您可能会考虑使用通知或委托模式来运行下一步。

对于没有警告的进程炸弹的情况,请尝试使用NSZombies来协助调试。

答案 2 :(得分:0)

我无法完全解决此问题。我最终决定使用更新的基于块的HTTP请求方法来重构应用程序。