1

我有一些为 iPhone 开发的经验,但完全是自学成才,并且正在努力改进我的实践。这是一个可能对编程非常入门的问题。

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

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

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

到目前为止,我刚刚在我的 AppDelegate 中为我需要跟踪的类似事情创建了 IVAR,然后像这样访问它们:

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

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

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

4

5 回答 5

2

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

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

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

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

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

于 2010-01-20T00:50:37.240 回答
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 优点(如果你想要的话,内存管理)。

于 2010-01-20T01:00:27.920 回答
1

Matt Gallagher 就这个问题发表了一篇很棒的文章。你可以在Cocoa with Love看到它。

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

于 2010-01-20T01:01:26.823 回答
0

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

于 2010-01-20T00:49:21.403 回答
0

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

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

于 2010-01-20T01:04:08.483 回答