gpt4 book ai didi

objective-c - 你能在 Objective-C 中完成某种形式的依赖注入(inject)吗?

转载 作者:搜寻专家 更新时间:2023-10-30 19:58:50 25 4
gpt4 key购买 nike

目前我在需要时直接硬编码另一个对象,我希望能够通过 init 方法接受它(我假设?)。在下面的代码中,我在 viewDidLoad 方法中创建了一个新的 HatService,出于可测试性/耦合原因,我不希望这样做。

- (void)viewDidLoad
{
[super viewDidLoad];
HatService* hatService = [[HatService alloc] init];
[hatService getHatById:self];
}

第一个问题 - 这应该如何在 objective-c 中完成?第二个问题 - 我应该为此担心还是根本不应该这样做?

更新

这是我的开始,但我似乎从未在运行时点击第一个 init 方法。我都在接口(interface)中声明了 - 我遗漏的任何其他内容都可以让我覆盖此 init 方法并注入(inject)服务依赖项?

注意 - 当我自己创建对象时,我可以手动点击它,但是当 appDeleage 执行工作时,我看不到它点击它(app delegate 如何在不调用我的 init 方法的情况下创建这个对象?)

-(id)initWithHatService:(HatService *)service
{
if (self = [super init])
{
[self setService:service];
}
return self;
}

-(id)init
{
HatService* hatService = [[HatService alloc] init];
return [self initWithHatService:hatService];
}

最佳答案

UIViewController 的指定初始化程序是 - (id)initWithNibName:(NSString *)nibName bundle:(NSBundle *)nibBundle。如果您希望从 nib 文件正确实例化您的 View Controller ,您将需要重写此方法,如果您正在尝试这样做的话。没有看到更多代码,无法判断,但肯定在某处调用了此方法。

其次,您需要重写您的 -init 方法,使其看起来像这样:

- (id)init {
return [self initWithHatService:nil];
}

每个 init 方法都应该调用您指定的初始化程序。

最后,当您处理 View Controller 时,人们通常不会在 init 方法中传递属性。实例化新 Controller ,然后将您喜欢的任何服务属性传递给它。

MyViewController *newContrlr = [[MyViewController alloc] initWithNibName:nil bundle:nil];
newContrlr.hatService = [[[HatService alloc] init] autorelease];

关于objective-c - 你能在 Objective-C 中完成某种形式的依赖注入(inject)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4639686/

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