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