iOS 5 + iPad 1 = азырақ жад бар

IPad-ге арналған қолданыстағы бағдарламамен байланысты мәселе бар. Бұл ішінара ана тілінде (жүктеу, жергілікті кэштеу және т.б.) жазылған өте ыңғайлы қосымшасы, ішінара UI үшін 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 аспектісін қалай оңтайландыруға болатын бірнеше идеям бар. Мысалы, құрылымды оңтайландырамын және сценарийлердегі жад бөлуді мүмкіндігімнен азайттым. Сондай-ақ, DIV + фон-суретімен IMG тегтерін ауыстырдым. Бірақ апаттар қалады.

Төменде бұл мәселені ақылға қонымды шешу.

Шешім

Жад туралы ескертулер бар, бірақ JavaScript ішіндегі бірде бір нәрсе мен ештеңені босатпаймын. Сондықтан мен күлкілі нәрсе жасауды ұйғардым - бірнеше мегабайттың күлгін жиынын бөліп, оны еске салуға қалдырдым. Бұл жаңғақ, бірақ ол мен үшін жұмыс істейді: қарапайым malloc() бастап 100 мегабайтқа дейін жедел жадыға бөлуге болар еді

// 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)]];

Міне, бұл - 1 мегабайтты құрайтын 100 жады. Бұл параметрлер қайта қарауға жатады.

Енді біз қажет болғанша көп еске дейін босатыла аламыз:

- (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];
}

Ең соңғысы - NSTimer көмегімен chunkCount-қа бір блокпен буферді толтыру.

Мен білемін, мен білемін. Жақсы шешім бар ма?

2
Сізге Құралдармен қарадыңыз ба? Менде осындай проблема бар, мен құралдармен ешқандай себеп жоқ. Бірақ егер сіз оны сынамаған болсаңыз, мен сіз білетін нәрсеге және оны қалай орнатуға қызығушылық танытамыз.
қосылды автор Jim, көзі
Бұл мүлдем ақылға сыймайды, бірақ мені қызықтырады. Бұл жадты қайда бөлісесіз?
қосылды автор TurqMage, көзі
Маған сіздің атаңызды құрастырғаныңыз ұнайды. ;)
қосылды автор sElanthiraiyan, көзі
Өкінішке орай, бұл әдіс мәселені толығымен шешпейді. Менің бағдарламам әлі де апатқа ұшырайды. Құрылғыны қайта іске қосқаннан кейін ол өте ұзақ уақыт жұмыс істейді, бірақ көптеген бағдарламалар фонда іске қосылғанда, есте сақтау туралы ескерту алуы мүмкін. UIWebView іске асыруда негізгі мәселе тереңірек көрінеді.
қосылды автор Denis, көзі

Жауап жоқ

0