C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了objective-c – 使用回调时内存泄漏大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
在处理目标c中的回调和异步代码时,我遇到内存管理问题.
我似乎无法找到一种方法来释放设置回调的实例.

例如:

@H_590_10@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中的instruments来分析我的代码我总是在这里泄漏.函数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中释放_success和_fail

并在@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);
}

我希望这能让我更深入地了解我做错了什么.

编辑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).

解决方法

内存管理并没有什么不同,因为您使用的是异步回调. myArchive应该是你正在做的任何类的属性.你希望它在任务完成之前保持不变,对吧?

@property (retain) MyClass *myArchive;

然后..

@H_590_10@myArchive = [[MyClass alloc] init]; void (^on_success_callBACk)(void) = ^(void){ NSLog(@"success"); self.myArchive = nil; };

您需要确保正确管理回调,即从堆栈中复制它们并在完成后释放它们.

如果您的代码中有保留和释放,则可能没有正确使用访问器方法.

@H_197_61@

大佬总结

以上是大佬教程为你收集整理的objective-c – 使用回调时内存泄漏全部内容,希望文章能够帮你解决objective-c – 使用回调时内存泄漏所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。