2012-02-01 2 views
1

У меня есть приложение, которое изо всех сил пытается хорошо работать на iOS 5, работающем на iPad 1. Это очень часто сбой с предупреждением LowMemory.Будет ли ARC понижать мой пик памяти?

приложение является огромным, сложным (..convoluted), использует основные данные, ....

Я хочу, чтобы попытаться уменьшить след пик памяти. Во всем мире есть автореализованные объекты, которые я мог бы преобразовать, но это может занять меня навсегда.

Будет ли преобразование проекта в ARC автоматически преобразовывать эти объекты с автореализацией, чтобы сохранить/освободить, когда он скомпилирован с ARC ..... и, возможно, уменьшит мой пик памяти?

Благодаря

ответ

1

хмм .. Я думаю, что это, безусловно, обрушить свой след, но эффект будет не слишком драматично. Отпечатки памяти зависят в большей степени от дизайна вашего кода, от того, как вы создаете свои объекты и как эффективно вы используете один и тот же объект снова и снова .. любые другие идеи кто-то ..?

1

ARC может помочь, и он может не понравиться. Это зависит от того, насколько хорошо вы управляете памятью без нее. Я бы предположил, однако, что есть другие дизайнерские решения, которые вы сделали, которые следует пересмотреть - их исправление будет намного больше для достижения вашей цели.

1

ARC делает ниже пик объем памяти, но обычно только незначительно. Исключением является то, что вы выполняете много операций с автореализацией в рамках одного цикла runloop или у вас есть поток, в котором у вас есть только один пул автозаполнения, который вы никогда не истощаете.

Рассмотрим:

- (void)myBackgroundThread 
{ 
    NSAutoreleasePool *pool; 

    pool = [[NSAutoreleasePool alloc] init]; 

    for (int i = 0; i < 1000000; i++) { 
     NSString *dummy = [NSString stringWithFormat:@"%d", i]; 
     NSLog(@"%@", dummy); 
    } 

    [pool release]; 
} 

Это произведет по крайней мере миллиона autoreleased строковых объектов (NSLog может генерировать некоторые больше, я не знаю). Все они складываются до тех пор, пока цикл не будет завершен, и пул будет выпущен.

Однако, с ARC, это будет выглядеть следующим образом:

- (void)myBackgroundThread 
{ 
    for (int i = 0; i < 1000000; i++) { 
     NSString *dummy = [[NSString alloc] initWithFormat:@"%d", i]; 
     NSLog(@"%@", dummy); 
     // The compiler inserts "objc_release(dummy);" here 
    } 
} 

Так очищаются временные конструкции немедленно, понижая пик.

+0

- это только разница ..? –

+0

Да, это то, что я думал. Я надеюсь, что мое приложение станет исключением - и ARC вылечит все мои беды. – bandejapaisa

+0

@Ankit Srivastava: Что еще вы ожидали? Первый пример накапливает миллион струнных объектов до их очистки, второй - только один строковый объект, так что это уже довольно хороший результат. Теоретически версия ARC также быстрее, так как «objc_release» может сохранить вызов метода Objective-C, если переданный объект не переопределил 'dealloc'. – DarkDust

Смежные вопросы