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
答案 0 :(得分: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
放入两种方法中,然后进行测试!
更新:
尝试以下代码,
-(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
则会调用它。)