ios - 使用 xCode 4.3 的 iOS 中的泄漏检测问题

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

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

  1. 项目是在没有 ARC 支持的情况下创建的。
  2. 创建一个继承 UIView 的简单类
  3. 使用“按钮”创建此类的实例并“泄漏”它...泄漏不会被 Leak Instruments 捕获

所以这是问题类的代码

@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 仪器检测到的!

最佳答案

也许它没有泄漏?

您正在调用一个黑盒子方法。 UIView initWithFrame 是如何实现的与你无关。它有某种契约(Contract),但你无权要求它泄漏,就像你可以假设保留计数为 1 一样。

Leaks 是一个有用的工具,但它并不像您想象的那样。当你搞砸了,它不会告诉你。当您有无法访问的分配时,它会告诉您。这不是一回事。

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

关于ios - 使用 xCode 4.3 的 iOS 中的泄漏检测问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9472065/

相关文章:

ios - 在现有项目中启动 React Native 后返回 native 应用程序

ios - 某些信标仅在前景中或显示在

objective-c - 通知所有已加载的 ViewController 某个事件

iphone - Storyboard警告 : prototype table cells must have reuse identifiers

ios - 在 ARC 中监控引用计数

ios - 使用 ARC 为 @property 覆盖 @property setters with 'copy'

ios - EXC_BAD_ACCESS 和 MPMusicPlayerController

ios - 如何在 Interface Builder 中将 Subview 添加到 UIButton

iphone - 组合标签、 TextView 和图像(但图像与文本滚动)

Objective-C ARC 构造函数应该设置实例变量还是属性?