Tôi có một ứng dụng dựa trên ARC tải khoảng 2.000 hình ảnh mã hóa Base64 khá lớn (1-4MB) từ một dịch vụ web. Nó chuyển đổi các chuỗi đã giải mã Base64 thành .png
các tệp hình ảnh và lưu chúng vào đĩa. Đây là tất cả được thực hiện trong một vòng lặp mà tôi không nên có bất kỳ tài liệu tham khảo kéo dài.Mục tiêu C UIImagePNGGiới thiệu về vấn đề bộ nhớ (sử dụng ARC)
Tôi đã lược tả ứng dụng của mình và phát hiện ra rằng UIImagePNGRepresentation đang chiếm khoảng 50% bộ nhớ có sẵn.
Cách tôi xem, UIImagePNGĐại diện đang lưu vào bộ nhớ cache hình ảnh mà nó tạo. Một cách để khắc phục điều này là xóa bộ nhớ cache đó. Bất kỳ ý tưởng làm thế nào người ta có thể làm điều đó?
Một giải pháp khác là sử dụng thứ gì đó khác với UIImagePNGĐại diện?
Tôi đã thử điều này mà không có may mắn: Memory issue in using UIImagePNGRepresentation. Chưa kể rằng tôi không thể thực sự sử dụng giải pháp được cung cấp ở đó vì nó sẽ làm cho ứng dụng của tôi quá chậm.
Đây là phương thức tôi gọi từ vòng lặp của tôi. UIImage là hình ảnh chuyển đổi từ Base64:
+ (void)saveImage:(UIImage*)image:(NSString*)imageName:(NSString*)directory {
NSData *imageData = UIImagePNGRepresentation(image); //convert image into .png format.
NSFileManager *fileManager = [NSFileManager defaultManager];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); //create an array and store result of our search for the documents directory in it
NSString *documentsDirectory = [paths objectAtIndex:0]; //create NSString object, that holds our exact path to the documents directory
NSString *pathToFolder = [documentsDirectory stringByAppendingPathComponent:directory];
if (![fileManager fileExistsAtPath:pathToFolder]) {
if(![fileManager createDirectoryAtPath:pathToFolder withIntermediateDirectories:YES attributes:nil error:NULL]) {
// Error handling removed for brevity
}
}
NSString *fullPath = [pathToFolder stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.png", imageName]]; //add our image to the path
[fileManager createFileAtPath:fullPath contents:imageData attributes:nil]; //finally save the path (image)
// clear memory (this did nothing to improve memory management)
imageData = nil;
fileManager = nil;
}
EDIT: Kích thước hình ảnh khác nhau khoảng từ 1000 * 800-3000 * 2000.
Tôi đã thử autoreleasepool nhưng nó không giúp ích gì. Đối với một số lý do các ứng dụng bị treo khi tôi cố gắng để hồ sơ nó với autoreleasepool .. Tôi sẽ thêm các kích thước hình ảnh cho câu hỏi của tôi. – JHollanti
Tôi đã thêm điều khiển autoreleasepool vào một loạt các địa điểm khác và toàn bộ sự việc bắt đầu hoạt động. Nó sẽ được dễ dàng hơn nhiều để bắt đầu với nếu tôi có thể đã profiled ứng dụng của tôi khi nó chứa autoreleasepools. @vikingosegundo Đã từng có vấn đề về hồ sơ này mà tôi đang gặp phải chưa? – JHollanti
không. nhưng tôi thường xuyên gỡ rối và các vấn đề về lược tả với lldb. Tôi đã chuyển về gdb. – vikingosegundo