关于类的实例化的Obj-C iPhone架构

时间:2011-10-17 20:38:44

标签: objective-c architecture

关于如何构建我的iPhone应用程序,我有一个noob问题。

我有两个主要组件,一个是地图和一个音频播放器,都是自包含的类(MapController和AudioController)。我读了这篇很棒的文章,并试图将它应用到我的应用程序中:

http://blog.shinetech.com/2011/06/14/delegation-notification-and-observation/

我有第三个类WebServices,用于处理将POST数据上传到我的服务器以及对外部API进行查询。

我的问题:

  1. 我是否导入头文件,并在地图控制器和音频播放器中创建新的WebServices实例?然后每个控制器都可以引用它自己的Web服务进行查询?
  2. 或者,我应该在RootController上创建一个WebServices实例,然后将其传递给init上的地图和音频控制器吗?
  3. 特别是,我对哪种方法更有效地消耗内存感兴趣。或者如果它根本不重要。

    谢谢!

3 个答案:

答案 0 :(得分:2)

考虑为WebServices类创建单例并使用共享实例。看来这是你需要的设计模式。

关于问题的效率部分,第二种选择更有效,纯粹是因为你没有在RAM中存储尽可能多的数据。然而,假设您的课程内部存储不太多,则可能是不明显的。

@interface WebServices: NSObject
{
}

+ (WebServices*)sharedInstance;
@end

static WebServices *sharedInstance;
@implementation WebSerivces

+ (WebServices*)sharedInstance
{

  @synchronized(self)
  {
    if (!sharedInstance)
      sharedInstance = [[WebServices alloc] init];

    return sharedInstance;
  }
}

@end

答案 1 :(得分:0)

零点

不要求助于单例,而尤其不要处于多线程环境中。如果你需要解释,你可以搜索这个网站(提示:与ObjC类似的OO语言中反对它们的原因非常相似。例如C ++,Java,C#......)。

分享与否?

它最终取决于您的设计需要的行为,但我赞成选项#1作为默认设置。

  • 如果您需要多个实例,请不要害怕创建多个实例(除非您确实有非常非常好的理由)。
  • 如果构建起来很重,请考虑他们可以共享的不可变数据。
  • 支持较小的专用对象(WebServices可能很大)。较小的对象可以提供更大的灵活性,并降低程序争夺资源的机会。
  • 通过分享您会在这种情况下获得什么?通常,这只会增加运行时和实现的复杂性......但可以获得收益。如果不确定这些收益,您应该坚持使用多个实例来降低复杂性。
  • 多个实例允许程序根据需要执行多个异步请求。多个异步请求很好(但如果你有太多的活动请求,它显然会很慢)。
  • 当他们所依赖的对象允许多个实例(他们不强制共享)时,大多数程序更符合逻辑且易于维护。

假设多个实例(1)直到发现问题为止。即使在确定问题后,您通常也可以避免共享。

确定消耗更少内存的内存需要更多信息。如果您考虑共享的对象不是很大(非常不可能),那么它们本身并不是内存消耗的问题。

提出的任何一种方法都可能导致更多的内存消耗 - 它完全取决于上下文和执行。我们需要更多信息来具体回答这个问题。

这并不意味着共享很糟糕,但共享通常会使事情变得复杂,因为您需要设计对象以便在共享时表现出可预测性(特别是因为您在多线程上下文中操作)。

问问自己:

  • 分享WebServices会带来哪些重要好处?
  • 如何分享WebServices改善您的计划并降低复杂程度?

WebServices地图内容可能与音频内容不相互影响。在这种情况下,WebServices可能是基类的良好候选者,其中音频和地图服务是单独的子类(假设WebServices类已经很复杂)。

答案 2 :(得分:0)

我建议使用NSOperationQueueNSOperation,而不是WebServices单例。

请查看此sweet example from Apple,以便他们执行此操作以进行并发图像下载。这是一个Mac示例,但所有显示的类都可以在iOS上找到。他们使用NSInvocationOperation,但您可以使用NSOperation子类或NSBlockOperation来获得更清晰的代码。

您可以通过调用[NSOperationQueue mainQueue];来获取主队列单例,从任何地方将这些添加到单个队列中。在这种情况下,单身人员的工作只是管理队列(因此​​不会同时进行太多下载),不进行任何数据处理(这些都由NSOperation处理)。