我对 xCode 4.3 内存泄漏工具有一个非常奇怪的问题......基本上它在以下情况下不起作用......
- 项目是在没有 ARC 支持的情况下创建的。
- 创建一个继承 UIView 的简单类
- 使用“按钮”创建此类的实例并“泄漏”它......泄漏不会被 Leak Instruments 捕获
所以这是 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 仪器检测到!