Reputation: 102
I'm using MFMailComposeViewController to send email.
But it crashed when sending large attachments, because of low-memory.
Does 'Mail' allocate memory for attachments?
And how should I do to
>
Dec 3 11:57:36 unknown kernel[0] <Debug>: launchd[1507] Builtin profile: container (sandbox)
Dec 3 11:57:36 unknown kernel[0] <Debug>: launchd[1507] Container: /private/var/mobile/Applications/776D8BB7-805E-46B1-B208-DF2CFE46AB3A [69] (sandbox)
> >
Dec 3 11:57:48 unknown MobileMail[1483] <Warning>: Received memory warning.
Dec 3 11:57:49 unknown com.apple.launchd[1] <Notice>: (UIKitApplication:com.apple.mobilemail[0x26be]) Exited: Killed: 9
Dec 3 11:57:49 unknown com.apple.launchd[1] <Notice>: (UIKitApplication:com.yourcompany.TestApp[0xc7ed]) Exited: Killed: 9
Dec 3 11:57:49 unknown UserEventAgent[12] <Notice>: jetsam: kernel termination snapshot being created
Dec 3 11:57:49 unknown SpringBoard[1186] <Warning>: Application 'TestApp' exited abnormally with signal 9: Killed: 9
>
Dec 3 11:57:50 unknown SpringBoard[1186] <Warning>: Application 'Mail' exited abnormally with signal 9: Killed: 9
Dec 3 11:57:50 unknown SpringBoard[1186] <Warning>: Received memory warning.
Dec 3 11:57:50 unknown ReportCrash[1509] <Error>: Saved crashreport to /Library/Logs/CrashReporter/LowMemory-2012-12-03-115750.plist using uid: 0 gid: 0, synthetic_euid: 0 egid: 0
Dec 3 11:57:50 unknown kernel[0] <Debug>: launchd[1510] Builtin profile: MobileMail (sandbox)
Upvotes: 0
Views: 1207
Reputation: 3908
Mail doesn't have a limit, but an ISP would. A realistic limit for most people is probably 10MB, though you may want to keep it more around 5MB and split things across emails...
You can calculate the size of NSData using below code
NSData *pdfData=[NSData dataWithContentsOfFile:strpdfpath];
NSLog(@"PDFData Length is %.02fmb",(float)(int)[pdfData length]/1048576);
Then you can delete the file after successfully attached,
[[NSFileManager defaultManager] removeItemAtPath:[strpdfpath stringByDeletingLastPathComponent] error:&err];
Upvotes: 0
Reputation: 71008
If your attachment data is the contents of a file on disk, the best you can do as the caller is create an NSData object from a mapped file:
NSData * attachmentData = [NSData dataWithContentsOfFile:myPath
options:NSDataReadingMappedIfSafe error:&error];
This transparently keeps the file on disk until parts of it are accessed, and allows the system to be as efficient as it can be.
But beyond that, if you run out of memory on the device, the attachment is too big. It's also fairly likely that the if the device runs out of memory trying to attach an email, the email service probably wouldn't accept the email message anyways it would be so large.
Upvotes: 3