gpt4 book ai didi

ios - 范围不正确

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:28:12 26 4
gpt4 key购买 nike

我有两个类(class)

啊啊

@interface A : UIView

@end

上午

@implementation A

-(id)initWithCoder:(NSCoder*)aDecoder{
self = [super initWithCoder:aDecoder];
if(self){
[self initialize];
}
return self;
}

-(void)initialize{
[[NSNotificationCenter defaultCenter]addObserver:self name:keyboardnotificationwillshow];
}
@end

B.h

@interface B : A

@end

@implementation B

-(id)initWithCoder:(NSCoder*)aDecoder{
self = [super initWithCoder:aDecoder];
if(self){
[self initialize];
}
return self;
}

-(void)initialize{
//do some stuff to prepare B
[self setBackgroundColor:[UIColor redColor]];
}
@end

现在我将 B 放入界面生成器中并等待它通过 Storyboard加载但是!

现在是我的问题:

在我用来编写代码的所有语言中,我上面编写的实现将导致以下结果

  1. 创建B,调用它的initWithCoder方法,看到需要到super,到A的initWithCoder,看到需要在A中调用initialize(注意initialize是发明的方法,它是private的,是两个类的h文件中都没有声明),执行写在A中的initialize
  2. 返回self,返回给B的initWithCoder 看到它需要执行B的初始化,执行B的初始化,将B返回给任何想用编码器创建它的人

现在我已经通过调试运行它,这是实际结果: 创建B,initWithCoderB -> initWithCoderA ->initializeB ->return B

我的实际问题是:为什么它跳过了 initializeA?

日志输出

2014-05-19 14:45:23.270 MyApp[17780:60b] B initWithCoder
2014-05-19 14:45:23.270 MyApp[17780:60b] A initWithCoder
2014-05-19 14:45:23.272 MyApp[17780:60b] B initialize
2014-05-19 14:45:23.278 MyApp[17780:60b] B initialize

如果我将 initializeA 重命名为 initStuffA,这是日志输出

2014-05-19 14:48:41.700 MyApp[17795:60b] B initWithCoder
2014-05-19 14:48:41.701 MyApp[17795:60b] A initWithCoder
2014-05-19 14:48:41.701 MyApp[17795:60b] A initialize
2014-05-19 14:48:41.702 MyApp[17795:60b] B initialize

那么,为什么我不能有 2 个与私有(private)方法同名的方法,而且它们不会相互覆盖?因为它们是私有(private)的,所以我不能对它们调用 super

最佳答案

由于您覆盖了类 B 中的初始化方法,并且在调用初始化方法时创建了类 B 的实例,它将指向继承层次结构中最深的实现(在您的情况下是类 B 的初始化方法) )

关于ios - 范围不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23736623/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com