2012-04-13 3 views
0

우리는 사진을 업로드하기 위해 페이스북을 응용 프로그램에 통합했습니다. 이것은 훌륭하게 작동했지만 최근에는 XCode Alloc 도구를 사용하여 메모리 누수를 추적하여 끔찍한 것으로 여겨지는 것을 발견했습니다. 별도의 디스패치 스레드에서 업로드 프로세스를 실행 중입니다. 그런 다음 자동 릴리즈 풀에 페이스 북 업로드 메소드를로드하고 있습니다. 업로드가 호출되면 이미지가 해당 FB 프로파일로 이동합니다. 그러나 NSKeyValueMethodForPattern 업로드가 생성되고 약 500KB를 보유합니다. 그런 다음 큰 이미지 인 [NSConcreteMutableData appendBytes : length] get이 만들어지고 이미지 크기에 따라 약 4.5MB가 소비됩니다. 이 두 가지는 업로드 된 각 이미지에 대해 만들어지며 절대로 방출되지 않습니다! 나는 이것에 대해 상실감이있다. 범인 여기끔찍한 페이스 북의 IOS 통합 메모리 누수

- (FBRequest*)openUrl:(NSString *)url params:(NSMutableDictionary *)params 
      httpMethod:(NSString *)httpMethod delegate:(id<FBRequestDelegate>)delegate 
{ 
    [params setValue:@"json" forKey:@"format"]; 
    [params setValue:kSDK forKey:@"sdk"]; 
    [params setValue:kSDKVersion forKey:@"sdk_version"]; 
    if ([self isSessionValid]) { 
     [params setValue:self.accessToken forKey:@"access_token"]; 
    } 

    [_request release]; 
    _request = [[FBRequest getRequestWithParams:params 
            httpMethod:httpMethod 
             delegate:delegate 
            requestURL:url] retain]; 
    [_request connect]; // <<<< SAYING THIS IS 100% cause 
    return _request; 
} 

로 아래에 ALLOC 도구 포인트는 우리가 처리하고 이미지를 업로드 할 수있는 스레드 "릴리스"풀을 생성하는 데 사용하는 코드입니다.

backgroundQueue = dispatch_queue_create("com.somecomp.appnameo.bgqueue", NULL); 

dispatch_async(backgroundQueue, ^(void) { 
    NSAutoreleasePool *loopPool = [[NSAutoreleasePool alloc] init]; 
    NSData *imageNSData = [NSData dataWithContentsOfFile:[NSString stringWithFormat:@"%@/%@", docDir, self.fileName]]; 
    UIImage *img = [[UIImage alloc] initWithData:imageNSData]; 

    fbResponse = 0; 
    //[facebook requestWithGraphPath:@"me" andDelegate:self]; 
    [[delegate facebook] requestWithGraphPath:@"me/permissions" andDelegate:self]; 
    NSMutableDictionary *params = [NSMutableDictionary dictionaryWithObjectsAndKeys: 
            //@"Sent From Some APP!", @"name", 
            self.postTitle, @"caption", 
            // string, @"description", 
            img, @"picture", 
            //@"my photo's caption text here.", @"message", 
            nil]; 

    [img release]; 

    [[delegate facebook] requestWithMethodName:@"photos.upload" 
            andParams:params 
           andHttpMethod:@"POST" 
            andDelegate:self]; 
    [loopPool drain]; 
}); 

내가이 돼지들을 풀어 줄 수있는 다른 방법이 있습니까? 나는이 물건에 초보자가 아니지만 나는 이것으로 패배했다. 어떤 도움이라도 환상적 일 것입니다!

감사합니다. - 짐

+0

언제 FBConnect 코드를 마지막으로 업데이트하셨습니까? github에있는 그 방법을보세요, 167 줄 : https://github.com/facebook/facebook-ios-sdk/blob/master/src/Facebook.m – danh

+0

어제 밤에 코드를 업데이트했고 모든 종류의 재귀가있었습니다. 문제, 내가 바로 재귀 버그로 업데이 트를 찾아 와서. 나는 그 후 5 시간 동안 내 인생을 잃어버린 후 다시 업데이트했다. 여전히 같은 문제가 있습니다. – mejim707

답변

0

FBConnect 코드가 오래되었다는 것에 대한 내 의견을 참조하십시오.하지만 이전 버전에는 (모든 연결에 대해) 심각한 결함이 있었는지 의심 스럽습니다.

의심을 끄는 것은 비동기 호출입니다. FB의 연결이 이미 비동기로 작동하고 있으므로 메인에 요청을 남겨 두어야합니다. requestWithMethod가 즉시 반환되기 때문에 블록이 바로 완료됩니다.

+0

여기에 아주 좋은 점이 있습니다. 메인으로 다시 전송하려고 시도하지만 계속하기 전에 Facebook의 응답을 기다리는 대기 타이머를 사용하기 때문에 보조 스레드에 넣습니다. 업로드 된 사진을 표시하고 싶습니다. 업로드되지 않은 경우 사용자에게 알리고 싶습니다. 아마도 더 적절한 방법이 있을까요? 주 스레드에서 타이머를 사용하면 대기가있는 동안 앱이 일시 중지됩니다. 그러나 보조 스레드에서는 대기가 사용자에게 투명 해지고 앱이 빠르고 원활하게 동작합니다. 고맙습니다! – mejim707

+0

나는 이걸 시도해 보았고 업로드를 스레딩하고 있지는 않지만 남자 할당을 정확히 동일하게 만들었다. 8 이미지 = 약 80MB 할당. 나는이 시점에서 무엇을해야하는지 전혀 모른다. – mejim707

+0

정적 분석기를 실행 했습니까? 제품 -> 분석. 이것은 더 나은 단서를 제공 할 수 있습니다. – danh

관련 문제