2009-05-04 2 views
0

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

Я разрабатывает 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]; 
    } 

ответ

3

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

вы рилизинг eMailRow, даже если он установлен в autorelease.

Возможно, это проблема?

+0

На самом деле, я прокомментировал выпуск [eMailRaw]; и с тех пор, при нескольких случайных тестах, проблема не возникла! Огромное спасибо. Тем не менее, я немного сомневаюсь в том, что происходит с init/release. Неужели мне действительно нужно отчаянно чистить такие вещи? Это швы, чтобы быть немного преувеличенными. Я читал кое-что о Ленивой Загрузка. Это то, что я мог/должен использовать здесь? Каким будет преимущество, и как Lazy Loading переводится в моем коде? Я думаю, это другой вопрос, но любая помощь приветствуется. – 2009-05-04 23:28:04

+0

Правила управления памятью довольно просты и абсолютно необходимы для понимания - в противном случае вы будете часто рвать свои волосы. Совершенно просто, все, что вы назначаете, копируете или сохраняете, нуждается в соответствующем выпуске или авторекламе. Слишком много (или слишком мало) релизов на объекте дает вам EXC_BAD_ACCESS. Lazy loading не меняет эти основные правила. – rein

+0

Если вы что-то инициируете, как правило, вы должны его освободить. Обычно вы можете использовать конструкторы удобства для временных переменных, чтобы вы не отвечали за управление памятью. Однако очень важно понимать управление памятью какао. Руководство Apple является обязательным для чтения: . Там определенно кривая обучения, но как только вы преодолеете горб, это удивительно легко. – Chuck

Смежные вопросы