2013-11-19 5 views
0

Это может быть глупый вопрос, но я борюсь с некоторым нечетным увеличением памяти в цикле. Поэтому я думал, что у меня может возникнуть проблема с ARC.Управление памятью iOS ARC

Скажет, у меня есть функция, как это:

+(NSString *)getDocPathToFile:(NSString *)filename{ 

NSFileManager *fileManager = [NSFileManager defaultManager]; 

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    NSString *path = [documentsDirectory stringByAppendingPathComponent:fn]; 

    return path; 
} 

Теперь, что происходит с экземплярами переменными, как FileManager, тракты, documentsDirectory и путь? Уничтожаются ли они после возвращения значения и, таким образом, не занимают памяти?

Чтобы объяснить это немного дальше: я вызываю этот метод пару раз в цикле. Теперь, в инструментах, я вижу постоянное увеличение памяти в CFString (immutable), но я не могу отслеживать, где находится этот CFString (я не использую какие-либо материалы CoreFoundation, насколько мне известно). Я не уверен, что данная функция является ли преступник, может быть что-то совершенно разные ...

Спасибо за просветить меня ...;)

+0

Ваши переменные на самом деле являются слабыми. После окончания этой функции ARC освободится. Сама функция создаст новый экземпляр NSString, который вы собираетесь назначить переменной. Память останется сохраненной до тех пор, пока ничего больше не будет указано на эту новую строку. – Astri

+0

Отлично, спасибо за разъяснение ... – Swissdude

ответ

0

вы можете использовать @autoreleasepool для уменьшения ПАМЯТЬ го уровня WaterMark

например

for (/**/) // some loop 
{ 
    @autoreleasepool 
    { 
     // some code inside loop 
    } 
} 

или вы можете поместить @autoreleasepool внутри метода

+(NSString *)getDocPathToFile:(NSString *)filename{ 
    @autoreleasepool { 
     NSFileManager *fileManager = [NSFileManager defaultManager]; 

     NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
     NSString *documentsDirectory = [paths objectAtIndex:0]; 
     NSString *path = [documentsDirectory stringByAppendingPathComponent:fn]; 

     return path; 
    } 
} 
Смежные вопросы