【问题标题】:Memory leaks in main method and in a blockmain 方法和块中的内存泄漏
【发布时间】:2014-06-16 13:32:06
【问题描述】:

我在我的应用程序中发现了泄漏。当我使用仪器搜索泄漏时,我正在使用一个名为 SWRevealcontroller 的插件,我发现泄漏,如屏幕截图所示。我无法解决这些泄漏。

有没有办法修复这些泄漏。 我已按照某些教程进行操作,但无法解决这些问题。

Memory Leaks in main.m while profiling in Instruments?

http://www.raywenderlich.com/2696/instruments-tutorial-for-ios-how-to-debug-memory-leaks

  • (void)prepareForSegue: (UIStoryboardSegue *) segue sender: (id) sender {

    if ([segue isKindOfClass: [SWRevealViewControllerSegue class]]) {

    SWRevealViewControllerSegue *swSegue = (SWRevealViewControllerSegue*) segue;
    

    swSegue.performBlock = ^(SWRevealViewControllerSegue* rvc_segue, UIViewController* svc, UIViewController* dvc)

    {

        UINavigationController* navController = (UINavigationController*)self.revealViewController.frontViewController;
    
        [navController setViewControllers: @[dvc] animated: NO ];
    
      NSLog(@"abcd %@",dvc);
    
       NSLog(@"abcde %@",segue);
        [self.revealViewController setFrontViewPosition: FrontViewPositionLeft animated: YES];
    
    };
    

    }

这就是我使用该块的地方。

【问题讨论】:

  • 添加指向这些“某些教程”的链接。
  • 是的,我已经添加了它们

标签: ios objective-c memory-leaks automatic-ref-counting


【解决方案1】:

将块的副本用作属性而不是强属性,并确保不要在块内使用 self。如果您需要它,请创建 self 的弱副本。

@property (nonatomic, copy) void(^performBlock)(...);

...
//if you need self inside of any block
id __weak weakSelf = self;
...^(){
   //use weakSelf instead of self;
}

【讨论】:

  • 非常感谢您的建议。我试过了,但是无论我在哪里更改(在 2 个地方),它都会显示错误,因为在“__weak id const”类型的对象上找不到属性
  • 你到底尝试了什么?是关于weakSelf吗?顺便说一下,id应该是__weak,而不是__weak id。我只是用'id'作为例子,因为我不知道你在里面使用什么类。
  • __typeof(self) __weak weakSelf = self;我试过这个它工作正常。我可以知道它在块内应该是弱的原因吗?
  • 您可以在cocoawithlove.com/2009/10/how-blocks-are-implemented-and.html 这样的文章中阅读更多关于块的信息。简而言之,这是因为任何块都是一个对象,并且它保留了它使用的任何变量。由于您的 __typeof(self) 还保留了该块,这将创建一个保留循环。
  • 感谢您的帮助。请您确认我编写的代码行是正确还是错误。
【解决方案2】:

我已经完成了user2260054告诉我的修改,我已经添加了

__typeof(self) __weak weakSelf = self;

现在它工作正常。

【讨论】:

  • 根据这篇文章thirdcog.eu/pwcblocks,使用块的内存管理可能存在更多问题以及更多解决方案。每个块都保留自我,不仅在您显式使用 self 时,而且即使您在块内使用任何实例变量(后者是一个对象)!此外,不仅 __weak 修饰符可以防止问题(这可以防止增加 self 的保留计数器),而且 __block 修饰符如果您不使用 ARC 模式(这也会使变量在块内可变,默认情况下不正确)。小心!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-24
  • 1970-01-01
  • 1970-01-01
  • 2011-01-23
  • 2012-08-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多