Objective-C中间对象优化

3
通常我会选择选项B,因为它允许我在需要时对字典进行调试(如选项C所示)。在我看来,这样看起来更加整洁。也许这不是什么问题,但我想知道在iOS编程中执行此操作时,选项B或C是否使用更多的内存,或者是否有其他需要考虑的因素。顺便说一下,我正在使用ARC。
相对于选项B和C,使用选项A是否有优势?
// OPTION A
NSString *someString = [[self grabDictionaryFromDB] objectForKey:@"someField"];

// OPTION B
NSDictionary *dbRow = [self grabDictionaryFromDB]; // dbRow ONLY gets used in the next line
NSString *someString = [dbRow objectForKey:@"someField"];

// OPTION C
NSDictionary *dbRow = [self grabDictionaryFromDB]; // dbRow ONLY gets used in the next two lines
NSLog(@"Row: %@", dbRow);
NSString *someString = [dbRow objectForKey:@"someField"];

请查看此链接:http://stackoverflow.com/questions/12062162/does-an-auxiliary-variable-with-a-pointer-have-any-performance-memory-impact。 - Adam
你做过任何速度测试吗?我猜数字可以告诉你答案... - holex
@Adam谢谢,这解释得很清楚。我接受了dasblinken的答案,因为他花时间把它写下来(而且在你的评论之前我就看到了!)。holex,速度测试没有产生显著的结果,我更关心内存使用情况(而且我不知道如何在这种情况下测试内存使用情况)。 - Julian
2个回答

2

很可能选项A和B会被编译器优化成完全相同的输出,所以你从选项B中得到的唯一好处就是可读性。选项C可能需要额外的存储指令和ARC中的一对[retain]/[release],但与选项A或B相比,你不会注意到它的影响。


我还没有测试过,但ARC中不应该有任何保留和释放。此外,如果您使用优化编译,则很可能不会有额外的存储指令或空间使用。对于选项C,可能会有一个额外的寄存器移动指令。如果周围的代码很复杂并且使用了许多变量,则对于选项C可能会有一个额外的加载指令(加载,而不是存储)。如果您没有进行优化的编译(调试模式),那么情况就完全不同了。 - Analog File

0

我建议选择方案B,因为它在未来更容易修改。让我举两个场景:

问题一:您想使用该字典执行另一个操作。

//Option A version
NSString *someString = [[self grabDictionaryFromDB] objectForKey:@"someField"];
NSString *someOtherString = [[self grabDictionaryFromDB] objectForKey:@"someOtherField"];

//Option B version
NSDictionary *myDictionary = [self grabDictionaryFromDB];
NSString *someString = [myDictionary objectForKey:@"someField"];
NSString *someOtherString = [myDictionary objectForKey:@"someOtherField"];

如果[self grabDictionaryFromDB]执行时间很长怎么办?突然间你会执行两次而不是一次,而你只需要保存返回的字典指针并且只执行一次。

问题二:如果你将来突然想要访问另一个字典怎么办?使用上述选项,你只需要在选项B中更改一行代码,无论你访问字典的次数有多少。在选项B中,你只需要更改myDictionary的值。在选项A中,你需要更改大量的代码行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接