2015-03-18 2 views
0

Я просто хотел, чтобы сделать тест выступления на прошивке на моем проекте, и я немного удивлен такое поведения:IOS UIView наследственность плохая работа

В простом SingleView Заявке, если добавить 1000 UITextField на прямоугольнике (20, 20, 200, 200) от метода viewDidLoad: главный контроллер, он отлично работает. Это глупо, но это работает.

Теперь я создаю свой класс «MyTextField», унаследованный от UITextField и реализующий drawRect:. Реализация drawRect: реализация ничего не делает, и я не переопределяю другие методы UITextField. Я заменяю свой 1000 UITextField классом MyTextField и удивляюсь: он падает. Хуже того, мой iPhone перезагружается!

Я не понимаю, почему. Согласно документации Apple, мой drawRect не требует вызова super. Я также пытаюсь позвонить super drawRect:, но результат тот же. Перезагрузитесь из-за "Receive memory warning".

Есть объяснение этому, пожалуйста?

EDIT: быть ясно:

Он разбился (и мой iPhone перезагружается):

@implementation MyTextField 

-(void)drawRect:(CGRect)rect { 
    [super drawRect:rect]; 
} 

@end 

Он разбился тоже (и мой iPhone перезагружается):

@implementation MyTextField 

-(void)drawRect:(CGRect)rect { 
    // or does nothing 
} 

@end 

Он работает:

@implementation MyTextField 

@end 

Вот мой ViewController:

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    NSLog(@"######### START ###########"); 
    for (int i = 0 ; i < 1000 ; i++) { 
     MyTextField *tf = [[MyTextField alloc] initWithFrame:CGRectMake(20, 20, 200, 200)]; 
     [self.view addSubview:tf]; 
    } 
    NSLog(@"######### END ###########"); 
} 

Это делает ничего другого

+1

Посмотрите на этот вопрос для объяснения эффективности при реализации drawRect: http://stackoverflow.com/questions/18748276/why-an-empty-implementation-of-drawrrect-will-adversely-affects-performance- dur – KIDdAe

ответ

1

Они предупреждают, что пустой реализация DrawRect влияет на производительность

// Only override drawRect: if you perform custom drawing. 
// An empty implementation adversely affects performance during animation. 
+0

Хорошо Если я ничего не делаю в "drawRect:". Но если я назову «[super drawRect: rect]», он разбился, тогда как он должен быть тем же, что и не реализовывать «drawRect:» И не реализует «drawRect:» работает ... – QLag

+0

@QLag Я не понимаю вас, как реализуют drawRect и вызов супер должен быть таким же, как и не реализовывать его вообще? – IxPaka

+0

Если я не реализую drawRect :, он должен автоматически вызывать drawRect UITextField, не так ли? Если я реализую его для вызова супер, не должно быть одинаковым? – QLag

0

Я думаю, что нет никакой гарантии, что супер имеет реализацию DrawRect. Так что вызов [super drawRect: rect] может привести к сбою.

Причина, по которой это влияет на производительность, заключается в том, что изображение обычно не использует drawRect для рисования. Если вы реализуете drawRect, графический процессор должен разгрузить эту часть в CPU (называемый рендерингом на экране).

Я думаю, вы думаете, что реализация drawRect перезаписывает метод в суперклассе. Но вы должны больше подумать о проверке суперкласса, если существует drawRect (например, responsesToSelector) и вызывается только в этом случае.

+0

Это интересно, но я думаю, что если drawrect не существует ни в одном из суперклассов MyTextField, у меня должен быть «непризнанный селектор, отправленный экземпляру» вместо «Предупреждение о получении памяти». – QLag

+0

Да, вы правы. Также в документах говорится, что «реализация по умолчанию ничего не делает», а не то, что она не существует. – Thyraz