Ios 从部件内部修补部件

Ios 从部件内部修补部件,ios,objective-c,assembly,typhoon,Ios,Objective C,Assembly,Typhoon,我正在尝试从程序集中(或其他程序集中)修补程序集 中描述的方法工作得很好,但是当在多个应用程序中重用相同的程序集,而只尝试修补某些方面时,它有点复杂。我知道我可以模块化我的装配结构来完成这件事,但我会重复我自己,对于所有未修补的定义。子类化可能是另一种选择,但我需要将许多定义子类化,只是为了改变一个方面 简而言之:我正在尝试将其移动到我的程序集中: MiddleAgesAssembly* assembly = [[MiddleAgesAssembly assembly] activate]; T

我正在尝试从程序集中(或其他程序集中)修补程序集

中描述的方法工作得很好,但是当在多个应用程序中重用相同的程序集,而只尝试修补某些方面时,它有点复杂。我知道我可以模块化我的装配结构来完成这件事,但我会重复我自己,对于所有未修补的定义。子类化可能是另一种选择,但我需要将许多定义子类化,只是为了改变一个方面

简而言之:我正在尝试将其移动到我的程序集中:

MiddleAgesAssembly* assembly = [[MiddleAgesAssembly assembly] activate];
TyphoonPatcher* patcher = [[TyphoonPatcher alloc] init];

[patcher patchDefinitionWithSelector:@selector(knight) withObject:^id{
  return [assembly anotherKnight];

}];

[assembly attachPostProcessor:patcher];
一个可能的解决方案(我还没有尝试)可能是创建我自己的TyphondFinitionPostProcessor实现。但是在我在实现中失去自我之前,我想问一下,是否有人对一般问题有一个优雅的解决方案

虽然需要更多的变通方法,但我更想知道,是否可以从另一个程序集中修补程序集


谢谢,Martin

无法从另一个程序集修补程序集-这是当前不受支持的功能

但是,如果要创建可重用的部件并修补某些零件,则可以创建一个子类,该子类仅覆盖您要定制的零件

假设您有一个顶级程序集和一个协作程序集,如下所示:

@interface MiddleAgesAssembly : TyphoonAssembly

@property(strong, nonatomic, readonly) QuestProvider *questProvider;

@end
[MyAssembly new] activateWithCollaboratingAssemblies:@[HolyGrailQuestProvider new]];
//HolyGrailQuestProvider will act in place of the base quest provider
激活部件时,可以指定将替代基础部件的任何部件,如下所示:

@interface MiddleAgesAssembly : TyphoonAssembly

@property(strong, nonatomic, readonly) QuestProvider *questProvider;

@end
[MyAssembly new] activateWithCollaboratingAssemblies:@[HolyGrailQuestProvider new]];
//HolyGrailQuestProvider will act in place of the base quest provider

感谢您的回答,这就是我现在正在做的解决问题的方法,除了在激活后手动修补程序集之外。是否可以通过创建自己的TyphondFinitionPostProcessor来实现我的目标?嗯,不可以。程序集中的所有定义最终都位于TyphondComponentFactory的注册表中。TyphondFinitionPostProcessor负责迭代该注册表并对定义执行突变。我认为在定义到达注册表之前修改它们是行不通的。您必须钩住台风组件本身并修改它们。但是,如果您创建了一个修改定义并重写
init
的方法,以便将其作为该方法的最后一步调用,那么它将起作用。如果您想覆盖
init
,而不创建TyphonaAssembly的显式子类,您可以使用aspects库或swizzling之类的工具。这听起来像是一个选项。无论如何,我今天从子类化开始,它似乎比我最初认为的更合适。我想我会再考虑一会儿。谢谢你的帮助和时间!