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

Tor*_*ups 3 dependency-injection objective-c

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

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

第一个问题 - 如何在objective-c中完成?第二个问题 - 我应该担心这个还是做到这一点?

更新

这是我开始的,但我似乎从来没有在运行时遇到第一个init方法.我已经在界面中声明了 - 我错过的任何其他内容都允许我覆盖此init方法并注入服务依赖项?

注意 - 当我自己创建对象时,我可以手动点击这个,但是当appDeleage完成工作时我没有看到它(如果app委托创建这个对象而不调用我的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];
}
Run Code Online (Sandbox Code Playgroud)

kub*_*ubi 6

指定的初始化程序UIViewController- (id)initWithNibName:(NSString *)nibName bundle:(NSBundle *)nibBundle.如果您希望从nib文件中正确实例化视图控制器,则需要覆盖此方法,如果这是您正在尝试执行的操作.如果没有看到更多代码,就无法分辨,但这种方法肯定会被称为某个地方.

其次,您需要重新编写您的-init方法,如下所示:

- (id)init {
    return [self initWithHatService:nil];
}
Run Code Online (Sandbox Code Playgroud)

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

最后,当您处理视图控制器时,人们通常不会在init方法中传入属性.实例化新控制器,然后将其传递给您喜欢的任何服务属性.

MyViewController *newContrlr = [[MyViewController alloc] initWithNibName:nil bundle:nil];
newContrlr.hatService = [[[HatService alloc] init] autorelease];
Run Code Online (Sandbox Code Playgroud)