Sun*_*man 7 xcode memory-leaks ios xcode-instruments automatic-ref-counting
我对xCode 4.3内存泄漏仪器有一个非常奇怪的问题......基本上它在以下情况下不起作用......
所以这里是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
Run Code Online (Sandbox Code Playgroud)
现在我创造了泄漏......
- (IBAction)leak:(id)sender {
LeakTestView* leak=[[LeakTestView alloc]initWithFrame:CGRectMake(0, 0, 100, 100)];
NSLog(@"class is %@", [leak class]);
}
Run Code Online (Sandbox Code Playgroud)
所以问题是这个泄漏不会被发现......
如果我将基类更改为NSObject而不是initWithFrame重写init(请参阅下面的内容),那么将检测到泄漏....
所以这里是将被检测到的泄漏代码
@interface LeakTestView : NSObject
- (id) init;
@end
@implementation LeakTestView
- (id) init {
NSLog(@"init called");
self = [super init];
if (self) {
}
return self;
}
@end
Run Code Online (Sandbox Code Playgroud)
如果我现在创建对象并离开它 - 泄漏检测将触发,泄漏将被"看到"仪器.
- (IBAction)leak:(id)sender {
LeakTestView* leak=[[LeakTestView alloc]init];
NSLog(@"class is %@", [leak class]);
}
Run Code Online (Sandbox Code Playgroud)
有什么想法发生了什么?为什么不会检测到UIView子类的泄漏,但是将基类更改为NSObject会"解决"这个问题?哦,是的,使用"标记堆"可以看到泄漏的对象 - 泄漏前的一个标记和我点击按钮后创建泄漏的一个标记 - 该类将被看到堆三角形...
编辑:一个更"有趣"的情况......如果我删除"init"的东西(只分配对象)
LeakTestView* leak=[LeakTestView alloc];
Run Code Online (Sandbox Code Playgroud)
无论什么是基类,都会检测到泄漏......这到底是怎么回事?
编辑2:一个更"有趣"的事情.泄漏检测问题只能在模拟器中观察到(iOS 5.0,9A334是我的),但如果使用iPad设备,则会始终检测到泄漏...
任何意见?如果你没有问题或考虑我说"谎言"只是告诉我我错了,上面的案例工作"很好" - 我描述的泄漏被xCode工具检测到!
也许它没有泄漏?
您正在调用一个黑匣子方法。UIView initWithFrame 如何实现不关你的事。它有某种契约,但你没有权利要求它泄漏,除非你可以假设保留计数为 1。
Leaks 是一个有用的工具,但它的作用并不如您想象的那样。当你搞砸的时候它不会告诉你。它会告诉您何时有无法访问的分配。这不是同一件事。
或者,这可能是一个错误。