Управление памятью iPhone - PullRequest
0 голосов
/ 05 мая 2009

Я собираюсь сделать из себя дурака, но я заметил здесь много дружелюбных и терпеливых людей, поэтому я просто попробую:

Я разрабатываю приложение для iPhone, которое содержит базу отзывов об автомобилях. Я хочу, чтобы пользователь мог поделиться отзывами по электронной почте. Поэтому, когда он / она находит интересную машину в приложении, он нажимает кнопку, и приложение создает электронное письмо через приложение Mail.app для iPhone.

Теперь. Я новичок, и я должен признать, что я не слишком знаком с управлением памятью на iPhone. Код, который я написал, этот конкретный почтовый метод, выходит из приложения со страшным сообщением «Программа получила сигнал:« EXC_BAD_ACCESS »». Немного Googling предполагает, что это результат плохого управления памятью.

С моим небольшим пониманием этого вопроса я начал явно инициализировать и впоследствии освобождать все временные переменные, как сумасшедший. Тем не менее, «EXC_BAD_ACCESS» продолжает появляться.

Интересный момент: как только я убиваю свое приложение, созданный URL все еще вызывает Mail.app и с радостью создает для меня письмо.

Пожалуйста, рассмотрите следующий пример кода и пристрелите меня.

- (IBAction) sendCartoFriend
{
    CarAppDelegate *appDelegate = (CarAppDelegate *)[[UIApplication sharedApplication] delegate];

    //Read the html template
    NSString *resourcePath = [[NSBundle mainBundle] resourcePath];
    NSString *emailFile = [resourcePath stringByAppendingPathComponent:@"MailDummy.html"];
    NSMutableString *eMailRaw = [[[NSMutableString alloc] initWithContentsOfFile:emailFile]autorelease];

    //set the variables
    NSString *carNamePlaceholder = [[NSString alloc] initWithString:@"CarTitle"];
    NSString *carName = [[NSString alloc] initWithString:car.shortname];
    [eMailRaw replaceOccurrencesOfString:carNamePlaceholder withString:carName options:NSCaseInsensitiveSearch range:NSMakeRange(0, [eMailRaw length])];
    [carNamePlaceholder release];
    [carName release];

    NSString *carReviewPlaceholder = [[NSString alloc] initWithString:@"CarReview"];
    NSString *carReview = [[NSString alloc] initWithString:car.review];
    [eMailRaw replaceOccurrencesOfString:carReviewPlaceholder withString:carReview options:NSCaseInsensitiveSearch range:NSMakeRange(0, [eMailRaw length])];
    [carReviewPlaceholder release];
    [carReview release];

    //there are 5 more of these find/replace actions. the "CarReview" though is the biggest. It might contain several hundred of characters.

    //compose the message
    NSString *eMailSubject = @"Nice little car!";
    NSString *encodedSubject = [[NSString alloc] initWithString:[eMailSubject stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; 
    NSString *eMailBody = eMailRaw;
    NSLog(eMailBody);
    NSString *encodedBody = [[NSString alloc] initWithString:[eMailBody stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];


    NSString *urlString = [[NSString alloc] initWithString:[NSString stringWithFormat:@"mailto:?subject=%@&body=%@", encodedSubject, encodedBody]];
    NSURL *url = [[NSURL alloc] initWithString:urlString];

    [urlString release];
    [encodedBody release];
    [encodedSubject release];
    [eMailRaw release];

    [[UIApplication sharedApplication] openURL:url];

    [url release];
    }

1 Ответ

3 голосов
/ 05 мая 2009

Хм .. на первый взгляд:

вы выпускаете eMailRow, даже если для него установлено автоматическое освобождение

Может ли это быть проблемой?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...