2012-01-11 2 views
3

У меня возникли проблемы с обнаружением утечки памяти, что снова приводит к сбою моего приложения. Кажется, что память, выделенная для JPEGRepresentation, не освобождается. Это еще более любопытно, потому что объект NSData, созданный UIImageJPEGRepresentation, имеет размер около 300 кбайт (зависит от изображения), но на этом этапе использование памяти скапливается примерно на 3-5 мегабайт на изображение.UIImageJPEGПреобразование

Это код

QueuedObject* queuedObject = [[QueuedObject alloc] init]; 
[queuedObject setUrl:url]; 

QueuedObjectData* jsonQueuedData = [[QueuedObjectData alloc] init]; 
[jsonQueuedData setData:jsonData]; 
[jsonQueuedData setFilename:@"message.json"]; 
[jsonQueuedData setContentType:@"application/json"]; 
[jsonQueuedData setKeyValue:@"JSONMessage"]; 
[queuedObject addData:jsonQueuedData]; 

int i=1; 

QueuedObjectData* imageData = [[QueuedObjectData alloc] init]; 

for(id file in files) 
{ 
    if(file!=nil) 
    { 
     [imageData setData:UIImageJPEGRepresentation(file, 0.8)]; 
     [imageData setFilename:[NSString stringWithFormat:@"image%d.jpg",i]]; 
     [imageData setContentType:@"image/jpeg"]; 
     [imageData setKeyValue:@"image"]; 
     [queuedObject addData:imageData]; 
     i++; 
    } 
} 

[[UploadQueue sharedInstance] addObject:queuedObject]; 


[jsonQueuedData release]; 
[jsonData release]; 
[url release]; 
[imageData release]; 
[queuedObject release]; 

Может быть, у вас есть идея, чтобы помочь мне

приветы Manuel

ответ

3

Теперь вы используете только один imageData объект в вашем цикле. Таким образом, вы всегда создаете представление JPEG без удаления. Попробуйте этот код:

for(id file in files) 
{ 
    if(file!=nil) 
    { 
     QueuedObjectData* imageData = [[QueuedObjectData alloc] init]; 
     [imageData setData:UIImageJPEGRepresentation(file, 0.8)]; 
     [imageData setFilename:[NSString stringWithFormat:@"image%d.jpg",i]]; 
     [imageData setContentType:@"image/jpeg"]; 
     [imageData setKeyValue:@"image"]; 
     [queuedObject addData:imageData]; 
     [imageData release]; 
     i++; 
    } 
} 

Здесь вы создаёте объект, используйте его и удалите.

+0

Это на самом деле способ, которым я был раньше, а затем изменил его, отслеживая проблему. Любопытно, что приборы не обнаруживают никаких утечек, но внезапно приложение падает после Memory Low Warning Level 1 - без какой-либо другой информации в отладчике. – Manuel

+0

Но это такой подход неправильный? У вас возникли проблемы с этим кодом? – beryllium

+0

Извините за путаницу. Код, кажется, прав, но в Инструментах (Activity View - Memory Usage) я все еще вижу много и много памяти, используемой приложением. Есть ли способ узнать, где используется память? Если я смотрю в инструменте «Распределение инструментов», нет ничего даже близко к количеству, используемому здесь:/(Я говорю о 10+ мегабайтах для добавления 3 изображений (которые всего лишь около 300 kb каждый!) К моему объекту queuedObject) – Manuel