为什么UIView在设置框架时调用框架的getter方法?

时间:2016-09-13 06:14:12

标签: ios objective-c uiview frame

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:会被调用。 我很想知道那里发生了什么?有人有任何线索吗?

仅供参考,输出结果为:

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

1 个答案:

答案 0 :(得分:0)

首先是代码,

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

应该给出输出,

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

我的意思是两次,因为第一次是allocinit,第二次是你设置框架时。

现在提出要点,

它实际上并没有首先调用frame,它肯定是先调用setFrame,而是setFrame方法,

   super.frame = frame;

调用frame方法,使输出看起来像!!

如果您要在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则会调用它。)