2009-05-04 9 views
0

나 자신의 바보를 만들려고 해요,하지만 난 여기 주위에 많은 친절하고 환자 명을 발견했습니다, 그래서 난 그냥 그것을 시도 줄 :아이폰 메모리 관리

내가 아이폰 응용 프로그램을 개발하고 있어요을 , 그 자동차 리뷰의 데이터베이스가 포함되어 있습니다. 사용자가 리뷰를 이메일로 공유 할 수 있기를 바랍니다. 그래서, 그/그녀는 애플 리케이션에서 재미있는 자동차를 발견, 그/그녀는 버튼을 누르면 것이고, 응용 프로그램은 아이폰의 Mail.app을 통해 이메일을 작성합니다.

지금. 나는 초보자이고, 나는 아이폰의 메모리 관리에 익숙하지 않다는 것을 인정해야한다. 내가 작성한 코드,이 특정 메일 방법은 무서운 "프로그램 수신 신호 :"EXC_BAD_ACCESS ""메시지와 함께 응용 프로그램을 종료합니다. 인터넷 검색의 약간은 이것이 나쁜 메모리 관리의 결과라고 제안합니다.

이 문제에 대해 약간의 이해와 함께, 나는 미친 듯이 모든 임시 변수를 명시 적으로 초기화하고 나중에 릴리스하기 시작했습니다. 그럼에도 불구하고 "EXC_BAD_ACCESS"는 계속 나타납니다.

여기에서 흥미로운 점은 : 앱을 죽이면 생성 된 URL이 여전히 Mail.app를 트리거하고 행복하게 나를위한 이메일을 생성한다는 것입니다.

다음 샘플 코드를 고려하고 나를 쏴주세요. 당신이이 autorelease를 설정에도 불구하고 eMailRow을 발표하고

: 첫눈에

- (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

흠 ....

이것이 문제가 될 수 있습니까?

+0

사실, [eMailRaw release]를 주석 처리했습니다. 그 이후로 몇 가지 무작위 테스트를 통해 문제가 발생하지 않았습니다! 정말 고맙습니다. 아직도 init/release에 대해 조금은 확신이 없습니다. 나는 정말 이런 일을 미친 듯이 치워야 만합니까? 그것은 과장된 약간 솔기가있다. 지연로드에 대해 읽었습니다. 그게 내가 할 수있는/할 수있는 일인가요? 장점은 무엇이며 Lazy Loading이 제 코드에서 어떻게 번역됩니까? 다른 질문 이겠지만 도움을 주시면 감사하겠습니다. –

+0

메모리 관리 규칙은 아주 간단하며 알아야 할 절대적으로 중요합니다. 그렇지 않으면 자주 머리를 찢어 버리게 될 것입니다. 간단히 말해, 할당하거나, 복사하거나, 보존하는 모든 것에는 해당 릴리스 또는 자동 릴리스가 필요합니다. 개체에 대한 너무 많은 (또는 너무 적은) 릴리즈는 EXC_BAD_ACCESS를 제공합니다. 지연로드는 이러한 기본 규칙을 변경하지 않습니다. – rein

+0

무언가를 초기화하는 경우, 원칙적으로 그것을 해제해야합니다. 일반적으로 메모리를 관리 할 책임이 없도록 임시 변수에 편의 생성자를 사용할 수 있습니다. 코코아 메모리 관리를 이해하는 것은 매우 중요합니다. Apple 가이드는 반드시 읽어야합니다 : . 학습 곡선이 분명히 있지만 일단 고비를 극복하면 놀라 울 정도로 간단합니다. – Chuck