2016-09-13 7 views
0

UIViewは、フレームの設定時にフレームのゲッターメソッドを呼び出します。UIViewはフレームの取得時にフレームの取得メソッドを呼び出すのはなぜですか?

以下

がコードテストされます。

@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); 

私はそれが呼ばれsetFrame:frameを呼ぶだろうことがわかりました。 私はそこに起こっていることを知りたいですか?誰か手掛かりがありますか?

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); 

があるため最初のときに、私は2回を意味する、などの

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

を出力を与える必要がありますallocinitと2回目にフレームを設定します。

が、今では実際には最初のframeを呼び出していない、主なポイントに

を来る、間違いなくあなたの出力がどのように見えるように

super.frame = frame; 

frameメソッドを呼び出して、最初のが、setFrame方法でsetFrameを呼んでいます! !

super.frame = frame;setFrameに設定すると、frameメソッドが呼び出されることはありません。

両方の方法でbreakpointを入力し、テストしてください。

更新:

-(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スーパークラスのframe methodとなりますので、super.frame = frame;を呼び出すと、確実にframeメソッドが呼び出されます(overriddenが呼び出された場合)。

+0

はい、 '' 'initWithFrame:' ''の呼び出しのために2回出力されます。私はポストでそれを修正しました。 – AntiMoron

+0

メソッドとチェックの両方にブレークポイントを設定します。 'super.frame = frame;'とコメントしてから、チェックしてください! – Lion

+0

主なポイントは私がまだ混乱していることです! UIViewの '' setFrame''メソッドがなぜ '' 'frame'''メソッドを呼び出さなければならないのか分かりません。それは、レイアウトに影響を与えるいくつかの厄介なことをするために '' 'frame''メソッドをオーバーライドすることができないため、安全ではありません。個人的には、 '' frame''メソッドの呼び出しは、 – AntiMoron

関連する問題