6

我有Xcode的4.3内存泄漏的仪器一个非常奇怪的问题...基本上不会在下列情况下工作...泄漏检测问题4.3

  1. 项目,而不ARC创建支持。
  2. 创建一个简单的类它继承UIView的
  3. 使用“按钮”来创建这个类和“泄漏”的实例吧...泄漏不会被泄露仪器可以捕捉

所以这里有问题的类

@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将“修复”这个问题? 哦,是的,泄漏的对象可以看到使用“标记堆” - 一个标记之前的泄漏和一个标记后,我点击按钮,并创建泄漏 - 班级将被视为堆三角洲...

编辑:多了一个“有趣”的局面......如果我删除了“初始化”的东西(只ALLOC对象)

LeakTestView* leak=[LeakTestView alloc]; 

然后泄漏会不管是基类检测...什么地狱在这里?

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

有何评论?如果你没有问题,或者认为我磺化聚醚醚酮“谎言”只是告诉我,我错了,上面的情况是工作“就好了” - 我的泄漏通过描述您的Xcode仪器检测!

+0

什么“乐器”?你使用什么泄漏检测器? – 2013-01-31 20:00:32

回答

0

也许它不泄露?

你拨打的是一个黑盒子的方法。 UIView initWithFrame的实现方式与您无关。它有一个合同的种类,但你没有权利要求这泄漏了,你可以认为保留数是1.

泄漏是一个有用的工具,但它并没有做你认为它的工作。它没有告诉你什么时候你搞砸了。它会告诉你何时有无法分配的分配。这不是一回事。

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

+0

谢谢你的回答。我知道泄漏检测不到分配(这个工具不是一个“魔术”解决方案来显示问题到代码中的位置),但是如果我检查“泄漏”对象的保留计数,它说1(它应该)所以唯一保留的是“有效”的是来自alloc。所以对我而言,即使是“非常简单的”,乐器也无法“发现”泄漏。创建一个示例项目来测试它是非常容易的 - 只需使用模拟器并泄露UIView的子类,并检查仪器是否会找到它... – Sunman 2012-02-28 13:50:16

+0

我知道,我完全同意它很奇怪,但是真的留着算,真的没有告诉你什么。忽略它> http://www.friday.com/bbum/2011/12/18/retaincount-is-useless/ – hooleyhoop 2012-02-28 15:10:14

+0

我知道,保留计数不能用于说“有多少外部对象引用我”,因为@property实现和可能的其他因素,但在某些情况下,它提供了正在进行的信息 - 在上述情况下,它保证对新创建对象的唯一引用来自alloc并且initWithFrame不会增加保留计数,并且这样可以防止泄漏仪器发现泄漏... – Sunman 2012-02-28 15:22:02