2011-09-14 6 views
4

목표 c에서 콜백 및 비동기 코드를 처리 할 때 메모리 관리에 문제가 있습니다. 콜백이 설정된 인스턴스를 해제하는 방법을 찾지 못하는 것 같습니다. 예를 들어콜백을 사용할 때 메모리 누수가 발생했습니다.

:

MyClass *myArchive = [[MyClass alloc] init] ; 
[myArchive callBack:^(RKObjectLoader* objectLoader, id object) { 

    NSLog(@"success"); 

} fail:^(RKObjectLoader* objectLoader, NSError* error) { 

    NSLog(@"failed"); 


}]; 

[myArchive searchArchive:words:paging]; 

나는 경우 또는 얼마나 인스턴스 * myArchive을 해제하려면 모르는되는 문제. 내 코드를 프로파일 링하기 위해 xcode 내의 인스트루먼트 사용하기 저는 항상 여기에 누수가 있습니다. searchArchive 함수는 restkit을 사용하여 서버에 대한 비동기 요청을 수행합니다. 콜백 내에서 인스턴스를 참조하지 않을 것이므로이 사이클이 유지 사이클을 일으키고 __block 및 기타 C 방법을 사용하여 모든 유지 보수주기를 피하는 방법에 대한 정보를 읽었지만 실제 코드가없는 상태로 유지됩니다. 콜백 * myArchive 인스턴스를 어떻게 릴리스합니까? 아무도 내가 이것을 objective-c 안에 처리해야한다고 설명 할 수 있습니까?

편집 : 할당 해제

에와 @interface

@interface myClass : NSObject<RKObjectLoaderDelegate> { 
    // holds the block callback for "success" 
    void (^_success)(RKObjectLoader* objectLoader, id object); 
    // holds the block callback for "fail" 
    void (^_fail)(RKObjectLoader* objectLoader, NSError* error); 
} 
내 _success 및 _fail을 해제 한 후 MyClass에

// Sets internal backs on this object which basically wrap the delegate 
// 
- (void)callBack: (void (^)(RKObjectLoader* objectLoader, id object))success 
      fail: (void (^)(RKObjectLoader* objectLoader, NSError* error))fail { 
    //sanity check 
    NSAssert(_currentDelegate != self, @"Delegate is another object. Can not set callback"); 

    // store our callback blocks in the instance 

    _success = [success copy] ; 
    _fail = [fail copy] ; 
} 

에 콜백을 설정 한 경우

입니다

더 많은 통찰력을 얻길 바랍니다. 내가 뭘 잘못하고있어.

편집 2 :

지금 오류하기 시작하고있어 확인 :

-(void)retrieveGallery{  

    //create call back for async and deal with the result 
    [_galleryItems callBack:^(RKObjectLoader* objectLoader, NSArray *objects) { 

     //success happy days. do a bunch of code here that does not cause leaks 

    } fail:^(RKObjectLoader* objectLoader, NSError* error) { 
     //retry the attempt to retrieve gallery data from the server 
     _retryCount++; 
     if (_retryCount < _maxRetryCount) { 
      [self retrieveGallery]; 
     } 


    }]; 

    //read the collection of gallery items from server 
    [_galleryItems readGallery]; 

} 

유일한 실제 메모리 누수가 콜백이 무엇 이제까지 이유는 다음 통화 실패를 캐치 할 때입니다 콜백 내에서 [self retrieveGallery] 기능을 다시 시도하십시오. 이것이 내가 누출을 일으키는 원인이되는 이유입니다. 다시 함수 (이 경우 retrieveGallery)를 시도해야합니다.

답변

1

비동기 콜백을 사용하기 때문에 메모리 관리가 실제로 다르지 않습니다. myArchive은이 작업을 수행하는 모든 클래스의 속성이어야합니다. 작업이 완료 될 때까지 주변에 붙어 있어야합니다. 그런 다음

@property (retain) MyClass *myArchive; 

..

myArchive = [[MyClass alloc] init]; 

void (^on_success_callback)(void) = ^(void){ 
    NSLog(@"success"); 
    self.myArchive = nil; 
}; 

당신은 당신이 즉, 제대로 콜백을 관리 스택에서 복사하고이 완료되면이를 해제되어 있는지 확인해야합니다.

코드에서 보유 및 릴리스가있는 경우 접근 방법을 제대로 사용하지 않는 것일 수 있습니다.

+0

지금은 당신과 사랑에 빠졌을 수도 있습니다 – glogic

+0

이 작품의 결과는 우연히 발견되어 'myArchive'를 조기에 발표 할 수 있습니다. '@ 속성 '의 atomocity를 변경하기 만하면 배경 스레드에서 이것을 테스트 할 때 콜백을 호출하면서'myArchive'가 dealloc이되었습니다. – Joe

+0

그래, 이것으로 더 테스트 한 후에도 똑같은 문제가 발생했습니다. 나를 위해 이것을 해결하기 위해 드로잉 보드로 돌아 가라.내일 더 많은 것들을 시도하고이 스레드로 돌아갈 것입니다. 여기에 늦었 어 – glogic

관련 문제