2010-06-23 84 views
0

我有两种可能性:我应该避免创建大量变量吗?

1)将一个对象存储在一个变量中,并在我的代码中使用该变量。但是这使用内存来存储对象吗?

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; 
BOOL bool1 = [userDefaults boolForKey: key1]; 
BOOL bool2 = [userDefaults boolForKey: key2]; 

2)不要将它存储在变量中,并在需要时从头开始创建它。

BOOL bool1 = [[NSUserDefaults standardUserDefaults] boolForKey: key1]; 
BOOL bool2 = [[NSUserDefaults standardUserDefaults] boolForKey: key2]; 

在这种情况下会推荐什么?如果对象之间存在差异,那么我怎么知道使用哪一个?

回答

3

就你在问题中显示的具体例子而言,在获得NSUserDefaults的这两种方法之间没有实际的区别。除非你正在处理大数据对象(如UIImages),否则你应该专注于代码的清晰性和可读性。如果事实证明在测试过程中遇到内存问题,请回过头来寻找方法以便稍后使用更少的内存。

+0

感谢您的信息。 – 2010-06-23 12:16:34

1

您还没有非常具体的,以什么样的数据。但无论如何,变量指向的是消耗内存的东西,而不是变量本身。

至于你的问题的其余部分,如果你发表评论解释为哪一部分你的系统是在这个时刻做你的应用程序解决此问题为中心,我将修改这反映了答案。

编辑:别人回答被接受之前,我可以更新我的答案。看到接受的答案。

+0

感谢您的快速回复。我编辑它。很难解释我想要达到的目标。但我添加了一个NSUserDefaults的例子。 – 2010-06-23 10:30:43

0

如果执行的操作是一个非常沉重的性能的方法,它可能是一个性能损失,每一次重做吧,当你根本就保存信息。

我觉得你必须选择

  1. 如果你有一个分配的内存有问题,重做。
  2. 如果内存问题是不是一个重要因素,所进行的操作是不是起伏,你有一个性能损失,重做。

我认为,这样做iPhone应用程序,内存是不是超临界(可能现在不过多任务定),这是更加重要心目中的工作量,即尽量不要重做同样的工作。但正如所说,这一切都取决于情况。

+0

非常感谢... – 2010-06-23 12:17:34

0

你的问题的措辞暗示你可能不完全理解C指针。你不是“将对象存储在变量中”。你的第一个例子中的userDefaults变量只是一个C指针。 +standardUserDefaults方法返回一个指向全局用户默认值对象的指针,该对象指定给userDefaults。在第二个例子中,你检索了一个指向该对象的指针两次,每行一次。

两者之间的唯一真正区别在于,在第二个示例中,您正在执行冗余消息发送以再次检索对象引用。您的示例不是性能至关重要的,但有些情况下您可能需要缓存对对象的引用,以避免发送冗余消息,例如在循环中。这一切都取决于你的程序的性能。

如果你对C指针不太熟悉,一定要阅读它们。它应该为你清理一些事情。

0

在第一个例子中,您没有使用任何更多的程序内存。 NSUserDefaults对象将以任意方式存储在堆上,而变量本身的存储将是a)一个寄存器,或者b)在堆栈上。寄存器不占用任何应用程序的实际内存,并且堆栈的内存已被保留。

此外,指针占用非常少量的内存 - 64位平台上的32位和8字节的4个字节。其中25万人将不到1 MB。像这样的个人标量是你应该寻找内存节省的最后一个地方。