2009-11-12 2 views
0

메모리 누수로 코드를 정리하려고하는데 '릴리스'방법에 문제가 있습니다. 여기 좋은 iPhone 메모리 시민이 됨

내 코드입니다 : 내가 [DICT 자료] 위의 라인과 같은 문제를하지 않는 이유 때

NSArray *dict = [[NSArray alloc] initWithContentsOfURL:url]; 

if (dict == nil) { 
    UIAlertView *alert = [[UIAlertView alloc] 
          initWithTitle:@"Error" 
          message:@"Cannot retrieve content. Please try again later." 
          delegate:self 
          cancelButtonTitle:@"OK" 
          otherButtonTitles:nil]; 
    [alert show]; 
    [alert release]; 
    [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; 
    return; 
} 
self.schedule = dict; 
[dict release]; 
[url release]; //I receive a runtime error here, "BAD ACCESS" 

이해가 안;

+3

URL 할당 방법을 나타내는 코드를 게시 하시겠습니까? – marcc

답변

0

하면 URL이 생성 된 방법을 보여주는 코드를 게시하지 않았기 때문에, 여기에 따라야 할 일반적인 규칙입니다 :

을 그때는 아마 그것을 해제해야한다 "초기화"로 시작하는 초기화와 객체를 작성하는 경우가. 다른 방법 (편의 방법)으로 만들어진다면 자동으로 다시 읽습니다. 예를 들면 : 당신은 오토 릴리즈 객체를 해제 할 수 있습니다 또는 당신이 (명백하게) 충돌을 얻을 것이기 때문에

NSArray *a = [[NSArray alloc]initWithContentsOfURL:url]; // release this later 

NSArray *a = [NSArray arrayWithContentsOfURL:url]; // this will be auto released 

은 기본적으로 당신은 단지, 프레임 워크는 당신에게 오토 릴리즈 객체를 준 여부에 여부를 볼 필요가있다.

Memory Management Guide을 살펴보십시오. 그것은 독서가 필요합니다.

0

당신은 release eat time을 부를 책임이 있으며, alloc, copy 또는 retain을 호출합니다.

이 경우에는 dict에 대해 alloc을 호출했지만 url이 아닌 (아마도 URL은 어디에서 오는지는 알 수는 있지만).

0

Objective-C를 사용하면 결과없이 nil 포인터에 메시지 (예 : 'release')를 보낼 수 있습니다.

포인터가 Null이 아니며 잘못된 것 (즉, 출시 된 개체)을 가리키면 EXC_BAD_ACCESS 예외가 발생합니다. URL 매개 변수는 어디에서 왔으며 릴리스 전화를하기 전에 보유 수 ([url retainCount])는 무엇입니까?