目的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)を試行する必要があります。
私は今あなたと恋し合いしているかもしれません – glogic
この作品の結果は偶然に起こり、早急に 'myArchive'をリリースする可能性があります。 '@プロパティ'のアトム速度を変更するだけで 'myArchive'がdeallocになりましたが、バックグラウンドスレッドでこれをテストするときにはコールバックを呼び出していました。 – Joe
これでさらにテストした後、同じ問題が発生しました。私のためにこれを解決する上で描画ボードに戻ってください。明日、このスレッドに戻ります。今すぐここで遅くなっています – glogic