2016-09-13 3 views
0

UIView вызывает метод getter кадра при установке его рамки.Почему UIView вызывает метод getter кадра при установке его фрейма?

Ниже тестируется код:

@interface Test: UIView 

@end 

@implementation Test 

-(void) setFrame:(CGRect) frame { 
    super.frame = frame; 
    NSLog(@"Frame set!!!"); 
} 

-(CGRect) frame { 
    NSLog(@"Frame!!!"); 
    return super.frame; 
} 

@end 

Test* inst = [[Test alloc] init]; 
inst.frame = CGRectMake(0, 0, 123, 123); 

я обнаружил, что он назвал бы frame на setFrame: называется. Я очень хочу знать, что там происходит? Есть ли какие-то подсказки?

FYI, выход:

Frame!!! 
Frame set!!! // Due to the call of initWithFrame: 
Frame!!! 
Frame set!!! // Setter 
+0

Спросите у Apple. Они написали код. – Avi

ответ

0

Первое ниже код,

Test* inst = [[Test alloc] init]; 
inst.frame = CGRectMake(0, 0, 123, 123); 

должен дать вывод, как,

Frame!!! 
Frame set!!! 
Frame!!! 
Frame set!!! 

Я имею в виду два раза, потому что первый, когда вы alloc и init это и второй раз, когда вы устанавливаете рамку.

Теперь пришел на главной точке,

Это на самом деле не называя frame первым, это, безусловно, вызывая setFrame первый, но в setFrame методе

super.frame = frame; 

вызовы frame метод, чтобы ваш результат выглядит! !

если вы прокомментируете super.frame = frame; в setFrame метод, то ваш frame метод не будет вызван, я думаю!

Вы должны положить breakpoint в оба метода, а затем проверить!

Update:

Try ниже код,

-(void) setFrame:(CGRect) frame { 

super.frame = frame; 
NSLog(@"Frame set!!!"); 
} 

-(CGRect) frame1 { 

NSLog(@"Frame!!!"); 
return super.frame; 
} 

или

-(void) setFrame:(CGRect) frame1 { 

super.frame = frame1; 
NSLog(@"Frame set!!!"); 
} 

-(CGRect) frame1 { 

NSLog(@"Frame!!!"); 
return super.frame; 
} 

теперь не будет вызывать frame1 метод. Вы дали имя метода как frame, что означает, что вы overriding super class's frame method, поэтому, если вы позвоните super.frame = frame;, тогда он обязательно вызовет метод frame (если overridden, то он будет вызван).

+0

Да, они выведут дважды из-за вызова '' 'initWithFrame:' ​​''. Я исправил это в сообщении. – AntiMoron

+0

класть контрольная точка в обоих методах и проверка. затем прокомментируйте 'super.frame = frame;' и затем проверьте! – Lion

+0

Главное, что я до сих пор смущен !!! Я не понимаю, почему '' 'setFrame'' метод UIView должен вызывать метод' '' frame'''. Это небезопасно, поскольку люди могут переопределить метод '' 'frame''', чтобы сделать некоторые неприятные вещи, которые влияют на макет. И лично я считаю, что вызов '' 'frame''' метода не должен быть задействован. – AntiMoron

 Смежные вопросы

  • Нет связанных вопросов^_^