У меня очень странная проблема с инструментами утечки памяти в xCode 4.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
Если я создам объект сейчас и оставлю его - сработает детектор утечки и утечка будет "видна" в Instruments.
- (IBAction)leak:(id)sender {
LeakTestView* leak=[[LeakTestView alloc]init];
NSLog(@"class is %@", [leak class]);
}
Есть идеи, что происходит? Почему утечка подкласса UIView не будет обнаружена, но изменение базового класса на NSObject "исправит" проблему? Ах да, утечку объекта можно увидеть с помощью "Mark heap" - одна метка до утечки и одна метка после того, как я нажму на кнопку и создам утечку - класс будет виден в дельте кучи...
EDIT: еще одна "забавная" ситуация... Если я удалю "init" материал (только alloc объекта)
LeakTestView* leak=[LeakTestView alloc];
то утечка будет обнаружена независимо от того, что является базовым классом... Что, черт возьми, здесь происходит?
EDIT2: еще одна "забавная" вещь. Проблема обнаружения утечки наблюдается только в симуляторе (iOS 5.0, 9A334 - моя), но утечка будет обнаружена всегда, если использовать устройство iPad...
Есть комментарии? Если у вас нет проблемы или вы считаете, что я говорю "ложь", просто скажите мне, что я ошибаюсь и вышеописанный случай работает "просто отлично" - утечки, которые я описываю, обнаруживаются вашими инструментами xCode!