Objective-C оптимизация промежуточных объектов

Я обычно делаю опцию B, поскольку он позволяет мне выполнять некоторую отладку в словаре, если мне нужно (как показано в опции C). По моему мнению, он выглядит более чистым. Возможно, это не проблема, но мне интересно, используют ли опции B или C больше памяти или если есть что-то еще, чтобы рассмотреть это при программировании iOS. Кстати, я использую ARC.

Есть ли преимущество в использовании опции A в отличие от опции B или C?

// 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"];
2 ответа

Скорее всего, опции A и B будут оптимизированы точно так же, как и результат компилятора, поэтому единственное, что вы получаете с помощью опции B, - это читаемость. Вариант C, скорее всего, потребует дополнительной команды хранения и пары [retain]/[release] из ARC, но вы не заметите влияния по сравнению с вариантами A или B.


Я предлагаю вариант 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 вам придется сменить кучу строк кода.

licensed under cc by-sa 3.0 with attribution.