Проблема обнаружения утечек в iOS с xCode 4.3

У меня очень странная проблема с инструментами утечки памяти в 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

Если я создам объект сейчас и оставлю его - сработает детектор утечки и утечка будет "видна" в 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!

7
задан Simon Hayter 31 January 2013 в 19:07
поделиться