使用xCode 4.3在iOS中出现泄漏检测问题

时间:2012-02-27 20:49:42

标签: ios xcode automatic-ref-counting memory-leaks xcode-instruments

我对xCode 4.3内存泄漏工具有一个非常奇怪的问题......基本上它在以下情况下不起作用......

  1. 在没有ARC支持的情况下创建项目。
  2. 创建一个继承UIView的简单类
  3. 使用“按钮”创建此类的实例并“泄漏”它......泄漏不会被泄漏仪器捕获
  4. 所以这里是PROBLEMATIC类的代码

    @interface LeakTestView :  UIView
    - (id)initWithFrame:(CGRect)frame;
    @end
    
    @implementation LeakTestView
    - (id)initWithFrame:(CGRect)frame
    {
        NSLog(@"initWithFrame called");
        self = [super initWithFrame:frame];
        if (self) {
    
            // Initialization code
        }
        return self;
    }
    @end
    

    现在我创造了泄漏...

    - (IBAction)leak:(id)sender {
        LeakTestView* leak=[[LeakTestView alloc]initWithFrame:CGRectMake(0, 0, 100, 100)];
        NSLog(@"class is %@", [leak class]);
    }
    

    所以问题是这个泄漏不会被发现......

    如果我将基类更改为NSObject而不是initWithFrame重写init(参见下文),那么将检测到泄漏....

    所以这里是检测到泄漏的代码

    @interface LeakTestView : NSObject
    - (id) init;
    @end
    
    
    @implementation LeakTestView
    
    - (id) init {
        NSLog(@"init called");
        self = [super init];
        if (self) {
    
        }
        return self;
    }
    @end
    

    如果我现在创建对象并离开它 - 泄漏检测将触发并且泄漏将被“看到”仪器。

    - (IBAction)leak:(id)sender {
        LeakTestView* leak=[[LeakTestView alloc]init];
        NSLog(@"class is %@", [leak class]);
    }
    

    任何想法是怎么回事?为什么不会检测到UIView子类的泄漏,但是将基类更改为NSObject会“解决”这个问题? 哦,是的,可以使用“标记堆”看到泄漏的对象 - 泄漏前的一个标记和单击按钮后创建泄漏的一个标记 - 该类将被看到堆三角形......

    编辑:一个更“有趣”的情况......如果我删除“init”的东西(只分配对象)

    LeakTestView* leak=[LeakTestView alloc];
    

    然后无论什么是基类,都会检测到泄漏......这到底是怎么回事?

    EDIT2:还有一个“有趣”的事情。泄漏检测问题只能在模拟器中观察到(iOS 5.0,9A334是我的),但如果使用iPad设备,则会始终检测到泄漏......

    有何评论?如果你没有问题或考虑我说“谎言”只是告诉我我错了,上面的案例工作“很好” - 我描述的泄漏被xCode工具检测到!

1 个答案:

答案 0 :(得分:0)

也许它没有泄漏?

您正在调用一个黑盒子的方法。 UIView initWithFrame是如何实现的,这不关你的事。它有各种合同,但你没有权利要求它泄漏,而不是假设保留计数为1。

泄漏是一种有用的工具,但它并不像你认为的那样做。当你搞砸了它时它并没有告诉你。它会告诉您何时有无法访问的分配。这不是一回事。

或者,它可能是一个错误。