1

我正在尝试将大型应用程序转换为使用协议而不是类作为程序集。这一切都相当简单,但它未能正确初始化。我已经追踪了这个问题。当 Typhoon 初始化程序集时,它会询问每个程序集的属性,如果它们是 Typhoon 类,则初始化它们。当我将键入的属性转换为 Typhoon 类时,效果很好;当我将该属性转换为协议类型时,Typhoon 不会将其识别为 Typhoon 类并且不会对其进行初始化并且初始化失败。

所有相关的 Typhoon 代码都在 [TyphoonAssembly init] 中的方法 resolveCollaboratingAssemblies 中。

这是示例代码:

这有效:

@class myCoreAssembly : TyphoonAssembly

@interface

@property (readonly, weak, nonatomic) myCoreAssembly *coreAssembly;

(methods)

@end 

这不会:

@protocol myCoreAssemblyProtocol

@interface

@property (readonly, weak, nonatomic) id <myCoreAssemblyProtocol> coreAssembly;

(methods)

@end 

@class myCoreAssembly :TyphoonAssembly <myCoreAssemblyProtocol>

@interface

@property (readonly, weak, nonatomic) id <myCoreAssemblyProtocol> coreAssembly;

(methods)

@end 

在 Typhoon Init 过程中的某一时刻(方法 propertyForName:(NSString *)propertyName isCollaboratingAssemblyPropertyOnClass:(Class)class),代码会检查属性类型是否是 TypeAssembly 的子类。协议版本没有通过这个测试。

关于解决方法的任何想法?

4

1 回答 1

1

我想我找到了解决办法。我将属性键入为 TyphoonAssembly,然后自动注入再次起作用。

没用:

@property (readonly, weak, nonatomic) id <myCoreAssemblyProtocol> coreAssembly;

作品:

@property (readonly, weak, nonatomic) TyphoonAssembly <myCoreAssemblyProtocol> *coreAssembly;

这也是有道理的,因为要自动注入该属性需要是 TyphoonAssembly 的子类。

于 2014-12-12T16:43:13.397 回答