iOS 5 + iPad 1 = менша доступна пам'ять

У мене виникла проблема з існуючою програмою для iPad. Це досить складне додаток, написане частково нативним (завантаження, локальне кешування тощо), частково використовуючи Sencha Touch для інтерфейсу користувача (без PhoneGap).

Application runs fine on both iPad 1 and iPad 2 under iOS4. But with public release of iOS 5 aproblem appears for iPad 1 users. Application crashes after several seconds of work. Some guys write that instead of 78 there are only 30 megs of memory available for iPad 1 under iOS 5. And the other blackbox is the UIWebView. Nobody knows its internal limitations.

У мене є кілька ідей, як оптимізувати аспект JavaScript та HTML. Наприклад, я оптимізував структуру та зменшив розподіл пам'яті в скриптах, як міг. Я також замінив теги IMG за допомогою DIV + фонового зображення. Але аварії залишаються.

Нижче наведено божевільне рішення проблеми.

Рішення

Є попередження про пам'ять, але я не можу випустити нічого рідного і нічого в JavaScript, я думав. Тому я вирішив зробити смішну річ - виділити манекен манекен на кілька мегабайт і випустити його на попередження про пам'ять. Це гайки, але це працює для мене: я міг виділити до 100 мегабайтів оперативної пам'яті на старті з простим malloc ()

// Member variable
void* dummy;

// - (void)init    
dummy = malloc(100000000L);

і звільни її вільно (), коли система запитає.

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];

    if (dummy) {
        free(dummy);
        dummy = nil;
    }
}

Цей додаток працює довше. На сьогоднішній день так добре ... Наступний крок - зробити можливим повторне відновлення пам'яті.

// Member variable
NSMutableArray* _memoryWorkaround;

// - (void)init
int chunkCount = 100;
int chunkSize = 1L * 1024L * 1024L;//1 megabyte

_memoryWorkaround = [[NSMutableArray alloc] initWithCapacity:chunkCount];

for (int i = 0; i < chunkCount; i++)
    [_memoryWorkaround addObject:[NSValue valueWithPointer:malloc(chunkSize)]];

Ось це - виділено 100 шматочків пам'яті на 1 мегабайт. Ці параметри можуть бути переглянуті.

Тепер ми можемо звільнити стільки ж, скільки потрібно пам'яті:

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];

    if ([_memoryWorkaround count]) {
        NSValue* val = [_memoryWorkaround objectAtIndex:0];
        free([val pointerValue]);
        [_memoryWorkaround removeObject:val];
    }
}

На виході вільний залишок:

- (void)dealloc {
    if ([_memoryWorkaround count]) {
        for (NSValue* val in _memoryWorkaround)
            free([val pointerValue]);
        [_memoryWorkaround removeAllObjects];
    }
    [_memoryWorkaround release];
    [super dealloc];
}

Останнє, що потрібно зробити - це заповнити буфер назад до chunkCount з NSTimer по одному блоку.

Здається, божевільний я знаю. Краще рішення існує?

2
Ви подивилися на це з інструментами? У мене така проблема, і я не бачив причини з інструментами. Але якщо ви цього не пробували, я був би зацікавлений у тому, що ви дізнаєтесь і як ви його встановили.
додано Автор Jim, джерело
Це здається абсолютно божевільним, але мені цікаво. Де ви виділяєте цю пам'ять?
додано Автор TurqMage, джерело
Мені подобається те, як ви обрали свою назву. ;)
додано Автор sElanthiraiyan, джерело
На жаль, цей метод не повністю вирішує проблему. Моя програма все ще падає. Після перезавантаження пристрою він працює досить довго, але коли багато програм вже працюють у фоновому режимі, вони можуть отримувати попередження про пам'ять, після чого роздувати. Здається, головна проблема - більш глибока реалізація UIWebView.
додано Автор Denis, джерело

Відповідей немає

0
IT KPI iOS
IT KPI iOS
74 учасників

Чат обсуждения IOS. - Оффтоп, флуд, оскорбления и вбросы здесь не приняты. - За нарушение - предупреждение или mute на неделю. - За спам и рекламу - ban. Все чаты IT KPI: https://t.me/itkpi/602

ios_jobs_ua
ios_jobs_ua
27 учасників

Mobile Dev Jobs UA
Mobile Dev Jobs UA
20 учасників

Публикуем вакансии и запросы на поиск работы по направлению iOS, Android, Xamarin, RN и т.д.