Проблема обнаружения утечек в iOS с xCode 4.3 - PullRequest
7 голосов
/ 28 февраля 2012

У меня очень странная проблема с инструментами утечки памяти в xCode 4.3 ... В основном это не работает в следующем случае ...

  1. Проект создан без поддержки ARC.
  2. Создайте простой класс, который наследует UIView
  3. используйте «кнопку» для создания экземпляра этого класса и «утечки» его ... утечка не будет обнаружена 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!

1 Ответ

0 голосов
/ 28 февраля 2012

Может не течь?

Вы вызываете метод, который является черным ящиком. Как реализован UIView initWithFrame - не ваше дело. У него есть своего рода контракт, но вы не имеете права требовать его утечки больше, чем вы можете предположить, что счет удержания равен 1.

Утечки это полезный инструмент, но он не делает то, что вы думаете, что он делает. Это не говорит вам, когда вы все испортили. Он сообщает вам, когда у вас есть недоступные места. Это не одно и то же.

Или это может быть ошибка.

...