gpt4 book ai didi

ios - 在 objective-c 中覆盖和自定义初始化

转载 作者:行者123 更新时间:2023-11-28 21:44:21 28 4
gpt4 key购买 nike

我有一个继承 MPMoviePlayerViewController 的类。我正在尝试重写 init 方法,这样我就不必为每个其他 -initWithSomething 函数重复代码。对于自定义 initWithSomething 方法,这将起作用。但我不知道如何让它适用于继承的 iniWithSomething 方法

-(instancetype)init
{
if(self = [super init]){
// This is code I don't want to repeat in initWithSomething methods
[self startWithHiddenControls];

AVAudioSession *audioSession = [AVAudioSession sharedInstance];
[audioSession setCategory:AVAudioSessionCategoryPlayback error:nil];
[audioSession setActive:YES error:nil];

[[NSNotificationCenter defaultCenter] removeObserver:self
name:UIApplicationDidEnterBackgroundNotification
object:nil];

[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(UIApplicationDidBecomeActive)
name:UIApplicationDidBecomeActiveNotification
object:nil];
}
return self;
}

-(instancetype)initWithContentURL:(NSURL *)contentURL
{

// Not overwriting doesn't use my overwriten init so i must do it.
// But how ?!?
// why [super init] makes inifinite loop? (I know the norm is [super <same method>])
if(self = [self init]){} // this will not work. Inifinite loop I believe.

return self;
}

//This method works fine
- (instancetype)initWithSettings:(NSDictionary *)settings
{
// [self init] works here but HOW?
if(self = [self init]){
//my custom stuff
}
}

在写这篇文章的过程中,我发现 [super init] 调用了 -(instancetype)initWithContentURL:(NSURL *)contentURL 并且存在无限循环问题。为什么指定初始化器init调用次要初始化器initWithURL?不应该反过来吗?请解释。

这是否意味着我应该将不想重复的代码放在 initWithURL 方法而不是 init 方法中。

编辑:这就是我所做的。我在 initWithURL 方法中输入了代码。现在默认的 init 和我的自定义 init 都会运行它。

最佳答案

为什么称init为指定初始化器?我相信,事实并非如此。引用the docs :

The designated initializer plays an important role for a class. It ensures that inherited instance variables are initialized by invoking the designated initializer of the superclass. It is typically the init... method that has the most parameters and that does most of the initialization work, and it is the initializer that secondary initializers of the class invoke with messages to self.

因此它似乎不满足这两个特性:它具有最少数量的参数并且显然它使用 self 调用另一个初始化器 (initWithContentURL)。所以,我相信,如果您找到了真正的指定初始化程序,一切都会按预期工作。

根据MPMoviePlayerViewController class reference ,指定的初始化程序是 initWithContentURL。所以你可以简单地覆盖它而不是 init

关于ios - 在 objective-c 中覆盖和自定义初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30845251/

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