2011-09-14 8 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以内に?

編集:私は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] ; 
} 

をコールバックを設定し、その後にdeallocで

と@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を解放場所です

これがより多くの洞察を与えることを願っています。私が間違っていること

EDIT 2:

[OK]を、私は今、エラーを表示するために始めている:

-(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'をリリースする可能性があります。 '@プロパティ'のアトム速度を変更するだけで 'myArchive'がdeallocになりましたが、バックグラウンドスレッドでこれをテストするときにはコールバックを呼び出していました。 – Joe

+0

これでさらにテストした後、同じ問題が発生しました。私のためにこれを解決する上で描画ボードに戻ってください。明日、このスレッドに戻ります。今すぐここで遅くなっています – glogic

関連する問題