У меня очень странная проблема с инструментами утечки памяти xCode 4.3... В основном это не работает в следующем случае...
- Проект создан без поддержки ARC.
- Создайте простой класс, который наследует UIView
- используйте «кнопку», чтобы создать экземпляр этого класса и «слить» его... утечка не будет обнаружена 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
Если я сейчас создам объект и оставлю его - сработает обнаружение утечки, и утечка будет "увидена" в Инструменты.
- (IBAction)leak:(id)sender {
LeakTestView* leak=[[LeakTestView alloc]init];
NSLog(@"class is %@", [leak class]);
}
Есть идеи, что происходит? Почему утечка подкласса UIView не будет обнаружена, но изменение базового класса на NSObject «устранит» проблему? Да, и да, утечку объекта можно увидеть с помощью «Отметить кучу» — одна отметка перед утечкой и одна отметка после того, как я нажму кнопку и создам утечку — класс будет виден в дельте кучи...
РЕДАКТИРОВАТЬ: еще одна "забавная" ситуация... Если я удалю "инициализацию" (только выделение объекта)
LeakTestView* leak=[LeakTestView alloc];
тогда утечка будет обнаружена независимо от базового класса... Что, черт возьми, здесь происходит?
EDIT2: еще одна "забавная" вещь. Проблема обнаружения утечки наблюдается только в Симуляторе (iOS 5.0, 9A334 у меня), но утечка будет обнаружена всегда при использовании устройства iPad...
Любые комментарии? Если у вас нет проблемы или вы считаете, что я говорю «ложь», просто скажите мне, что я ошибаюсь, и описанный выше случай работает «просто отлично» - утечки, которые я описываю, обнаруживаются вашими инструментами xCode!