如何在Objective-C中跨对象实例维护数据?

时间:2010-01-20 00:45:34

标签: iphone objective-c singleton global-variables instance-variables

我有一些为iPhone开发的经验,但我完全是自学成才,正在努力改进我的做法。这个问题可能非常适合编程。

使用对象的所有实例共有的值维护实例变量的最佳方式(或可能)是什么?是否可以创建,修改和检查对象及其属性是否发生在不同的地方?

假设我有一个跟踪用户滑动屏幕次数的对象。是否有可能在我的AppDelegate中分配该对象,然后以某种方式从不同的视图控制器增加该对象的count变量?

是否可以定义一个实例变量,使其在它所属的对象的所有实例之间共享?这样可以解决问题。

到目前为止,我刚刚在我的AppDelegate中制作了IVAR,用于我需要跟踪的事情,然后就像这样访问它们:

((MyAppDelegate *)[UIApplication sharedApplication].delegate).instanceVariable

但我不知道这是不是一个好习惯。可能不是。

这可能与全局变量或单身人士有关。或者上面显示的前缀“共享”,我也在其他地方看到过。我只是在寻找建议或指导方向。我希望这个问题有道理并且不太笼统。

5 个答案:

答案 0 :(得分:2)

我认为您提出的问题涉及针对不同情况的不同做法。在viewcontrollers之间共享数据是一个带有许多解决方案的问题,其中一个更好的方法是为所有viewcontrollers使用委托。

如果你想让一个Class管理它自己的所有对象,即使这些对象来来去去,你也可以做以下两件事之一:

  1. 使类具有单例,并跟踪分配和解除分配,以便知道它应该何时创建然后自行处理(如果需要)。这不是一个坏的方法,虽然它可能更多的工作。

  2. 创建一个管理其他类对象的控制器类。一个很好的例子可能是一类由viewcontroller类控制的视图。

  3. 让我们看看其他人的建议。

答案 1 :(得分:1)

在C ++或Java(等)中,你要找的是一个“静态实例变量”,这正是你所描述的:一个由所有类实例共享的实例变量。 Objective-C确实没有这样的野兽,但你可以使用一些普通的C语法给你一些非常相似的东西。

请参阅本页底部: http://iosdevelopertips.com/objective-c/java-developers-guide-to-static-variables-in-objective-c.html

(如果页面消失,代码的副本:)

@interface MyClass 
{
  // ...
}
+ (NSString *)myVar;
+ (void)setMyVar:(NSString *)newVa;
@end

@implementation MyClass
static NSString *myVar;
+ (NSString *)myVar { return myVar; }
+ (void)setMyVar:(NSString *)newVar { myVar = newVar; }
@end

在这种情况下,“myVar”是.m文件的全局,但由于它标记为“静态”(这是一个C技巧),编译器将其可见性限制为仅它所在的.m文件。(与如果您使用它,请密切关注多线程访问。)

FWIW,如果你正在构建一般需要强大的东西,那么每个人都分享的类似单身的物体是一个很好的方法;如果你这样做的话,你可以获得所有正常的Obj-C善良(如果你需要的话,可以进行内存管理)。

答案 2 :(得分:1)

Matt Gallagher发表了一篇关于这个问题的精彩文章。你可以在Cocoa with Love看到它。

然而,在mahboudz所说的多视图控制器模式中,代表团是首选。

答案 3 :(得分:0)

我会考虑使用单例作为资源管理器 - 也许你不需要资源管理器部分,但是单例会对你有很大的帮助。

答案 4 :(得分:0)

使用应用委托中的所有内容并在需要的地方访问它绝对是不好的做法。至少它意味着代码重用变得棘手。如果您创建一个新应用程序并想要使用视图或控件或系统的一部分,您还必须确保您的新应用程序委托实现所有正确的选择器和属性。 此外,随着您的应用程序的增长,您将不可避免地发现您的应用程序代理变得更大,更混乱,更难处理。
调试也变得很痛苦,因为更难确定特定问题涉及哪些代码片段。

我这样做是为了勾画出应用程序的哪些部分实际需要哪些信息,并在创建时将它们传递给ViewControllers。