2012-02-06 2 views
0

나는 내 인생에서 나도 알아낼 수없는 코드를 가지고있다. JSON 소스에서 데이터를 가져 와서 자습서 및 SO에 명시된대로 NSDictionary에 넣습니다. 응용 프로그램을 프로파일 링 할 때이 NSDictionary로 인해 메모리 누수가 발생하지만이 함수가 끝날 때 릴리스하면 응용 프로그램이 충돌합니다. 어떤 제안? 는 (그런데 : 나는 일반적으로의 Obj-C 프로그래밍에 새로 온 사람, 그래서이 코드는 주로 다양한 소스에서 cherrypicked됩니다.) 여기NSDictionary 누설 메모리

- (void)fetchedData:(NSData *)responseData { 
    //parse JSON for empty return 
    if([responseData length] != 0){ 

     NSError* error = nil; 
     //Convert JSON data to Obj-C 
     NSDictionary* allShotData = [NSJSONSerialization JSONObjectWithData:responseData options:kNilOptions error:&error]; 

     NSString *player = [[allShotData objectForKey:@"player"] objectForKey:@"name"]; 
     NSString *shotDribbblePage = [allShotData objectForKey:@"url"]; 

     NSString *shotTitle = [allShotData objectForKey:@"title"]; 
     NSURL *imageURL = [NSURL URLWithString:[allShotData objectForKey:@"image_url"]]; 
     shotPageURL = [shotDribbblePage retain]; 


     //*********************** 
     // Setup a-sync loading of shot 
     //*********************** 

     NSOperationQueue *queue = [NSOperationQueue new]; 
     NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(loadImage:) object:imageURL]; 
     [queue addOperation:operation]; 
     [operation release]; 
     [queue release]; 
    } 
    else{ 
     airballCount++; 
     if (airballCount <= 20) { 
      [self getDribbbleData]; 
     } 
     else{ 
      NSLog(@"Too many airballs. Bailing out"); 
      [self showNoConnectionModal]; 
     } 
    } 
} 

답변

2

:

shotPageURL = [shotDribbblePage retain]; 

당신은 아마 사용해야합니다 접근 :

self.shotPageURL = shotDribbblePage; 

내가 정말들이 구경에게 당신의 심판 계산을하기 때문에 당신이 어디서나 당신의 접근을 사용해야 함을 강조해야한다 r 당신 (예외 : initializers와 dealloc에는 없다). 베릴륨도 언급했듯이 접근자가없는 경우 수동으로 계산을 할 수 있습니다.

[shotPageURL release]; 
shotPageURL = [shotDribbblePage retain]; 

가 누출되어 반환 된 사전의 내용이라면, 다음은 (이상-유지)를 읽을 때 내용을/사용 참조한 방법은 다음과 같습니다 즉 기본 형식을 취합니다.

동시 컨텍스트에서 클래스를 사용하는 경우 일반적으로 잠금이 필요합니다.

UIImage을로드하거나 보조 스레드에서 UIKit 개체와 상호 작용하는 경우 - 좋지 않습니다.

+1

또는'[shotPageURL release]; shotPageURL = nil; shotPageURL = [shotDribbblePage retain]; '속성이없는 경우. – beryllium

+0

@ 베릴륨 언급 - 고마워. – justin

+0

감사합니다 저스틴, 그건 실제로 문제 중 하나지만, 그것은 유일한 것으로 밝혀졌습니다. 한 남자가 사본을 추가하고 나중에 수동으로 풀어 shotDribblePage를 복사하는 것에 대해 언급했습니다. 이것은 빨간 스파이크가 더 이상 나타나지 않는 것처럼 트릭을 분명히했습니다. –