При возврате NSArray
(или NSDictionary
и т.д.) из метода, который строит массив "на лету" с помощью NSMutableArray
, что является стандартным способом для этого и избегать случайных утечек памяти при использовании ARC
Например, скажем, у нас был класс со списком имен, и мы хотели вручную отфильтровать и захватить все имена, которые начинались с данной буквы:
- (NSArray *)getNamesByFirstLetter:(NSString *)firstLetter
{
NSMutableArray *returnValue = [[NSMutableArray alloc] init];
for(id item in self.names)
{
if([item hasPrefix:firstLetter])
{
[returnValue addObject:item];
}
}
return returnValue; // just return the above array
}
Когда дело доходит до возврата значения, я могу представить четыре возможных способа сделать это:
-
Верните
NSMutableArray
напрямую (как указано выше)return returnValue;
-
Верните a
copy
return [returnValue copy];
-
Возврат с помощью
NSArray arrayWithArray
:return [NSArray arrayWithArray:returnValue];
-
Создайте
NSArray
, вручную установитеNSMutableArray
вnil
:NSArray *temp = [NSArray arrayWithArray:returnValue]; // could use [returnValue copy] here too returnValue = nil; return temp;
Когда программа использует ARC, существует ли какая-либо реальная разница между этими четырьмя методами или она просто сводится к личным предпочтениям?
Кроме того, помимо возможных утечек памяти, есть ли какие-либо другие последствия при использовании одного метода над другим?
Заметьте, если это дубликат, дайте мне знать, и я отвечу на вопрос. Я попытался выполнить поиск, но с трудом пытался свести проблему до нескольких поисковых запросов.