关于ios:关于对象的类方法实例上运行方法的困惑

Confusion over running methods on Class Method instances of objects

所以,我让自己陷入了一个困惑,我的数据去了哪里,它存储在我的应用程序中。这不是一个具体的问题,所以希望有人能提供一个全面的答案。

我需要在几个UIViewController实例之间传递一些数据,目前我正使用名为my datamanager的单例对象来实现这一点。这个类有一个方法,一个称为+ (LCDataManager *) sharedDataManager的类方法,这个方法基本上检查sharedDataManager是否已经存在,如果已经存在,返回它,如果没有,创建它并设置它的变量。这意味着我可以在任何我喜欢的地方引用这个类,在任何我喜欢的地方访问和修改它的变量,跨多个类。

第一个问题:这是像这样传递数据的正确/最佳/最合适的方法吗?我希望它遵守MVC,感觉就像这样,我希望我是对的。

第二个问题:如果我想把一个实例方法放在该类中,并从类方法内部调用它,该怎么办?假设我的sharedDataManager需要调用一个方法来获取一些对象,其中一个变量(数组),并将它们放入另一个数组中,然后再将其发送出去。我不能那样做,是吗?怎么回事?如果我创建该类的一个实例(而不是使用共享实例),我将失去跨多个视图控制器使用该实例的能力。

我非常困惑,似乎我不是在制造问题。感谢任何指导,最好不要"阅读苹果文档"之类的东西——它们写得好像你已经知道自己在做什么,坦率地说,我还没有。


First question: is this the correct / best / most appropriate means of passing data around like this? I'm hoping it obeys MVC, it feels like it does, and I hope I'm right.

您的设计完全符合MVC标准。

Second question: what if I want to put an instance method in that class, and call it from within the class method?

您当然可以定义一个实例方法并这样调用它:

1
[[MyModelClass sharedModel] myInstanceMethod];

事实上,[MyModelClass sharedModel]会给你一个MyModelClass的实例(它应该保证是唯一的,因为它是单件的)。

如果您想从sharedModel类方法调用实例方法,也可以这样做,因为sharedModel拥有对您的singleton的引用,因此它可以向它发送消息。


is this the correct / best / most appropriate means of passing data around like this?

只有一个lcdatamanager实例没有什么问题,但是使用singleton模式有潜在的问题。另一种方法是只初始化一个lcdatamanger,并将其传递到需要的任何地方。

what if I want to put an instance method in that class, and call it from within the class method?

访问器+ (LCDataManager *) sharedDataManager只应返回实例。我猜你想要的是

1
2
3
4
5
6
7
8
9
10
11
+ (LCDataManager *)preparedDataManager {
    LCDataManager *shared = [self sharedDataManager];
    [shared doSomeInstanceMagic];
    return shared;
}

- (void)doSomeInstanceMagic {
    // magic!
    // grab some objects one of its variables (an array),
    // and put them in another array
}


Matthijs Hollemans在他的博客中提供了一个优秀的三部分教程,介绍了如何正确地让视图控制器相互通信:

  • 第1部分
  • 第2部分
  • 第3部分


这个开发架构没有问题,我认为它是iOS开发中必须使用的。在iOS编程:大书呆子牧场指南,他们称之为模型视图控制器商店。

关于第二个问题,是的,您可以声明实例方法,然后从您的sharedDataManager调用。不常见的是创建单例类的其他实例,但这是可能的。