TyphoonScopeObjectGraph 的工作原理

How TyphoonScopeObjectGraph works

比方说,我有下面的代码

self.customObj = self.assembly.customObj() as? NSObject
let temp3 = self.assembly.customObj() as NSObject

如果我对 customObj 使用 TyphoonScopeObjectGraph,它应该 return 是同一个实例。 但是当我调试时, customObj 属性与显示的不一样:

据我了解,customObjtemp3应该是同一个实例。但正如您在图中看到的,customObjtemp3 具有相同的 ObjectiveC.NSObject 地址,但其所有属性(_shortFormatter_longFormatter)具有不同的地址。发生什么事?我们如何为 customObjtemp3 获得相同的实例。一个例子非常有帮助。 谢谢。

您可以从here

获取项目源代码

在上面的示例中,如果您希望 self.customObjtemp3 是同一个实例,那么您需要 TyphoonScopeSingletonTyphoonScopeWeakSingleton

TyphoonScopeObjectGraph的工作方式是在解析期间如果两个实例声明它们依赖于另一个名为context的组件,那么同一个共享实例context 将被退回。然而,台风不保留这些。因此,您可以加载整个对象图(例如,视图控制器以及依赖项),然后在完成后丢弃它,而不是像其他情况那样使用单例。 TyphoonScopeObjectGraph 对于循环依赖也很有用,例如控制器和视图,它有一个委托 属性 指向控制器。

这有助于用一个例子来解释:假设我们有:

@interface MyViewController : UIViewController

@property(nonatomic, strong, readonly) InjectedClass(ShoppingCart) cart;
@property(nonatomic, strong) InjectedClass(MyView) view;

@end

@interface MyView : UIViewController

@property(nonatomic, strong, readonly) InjectedClass(ShoppingCart) cart;

@end

//ShoppingCart has object-graph scope
@interface ShoppingCart
@end

现在,如果我们要求 Typhoon 为我们提供 MyViewController 的实例,那么将返回一个控制器,其中 MyViewControllerMyView 将具有相同的 [= 实例22=]

  • 如果使用 TyphoonScopePrototype,那么每个都会有一个不同的实例 ShoppingCart
  • 如果使用了TyphoonScopeSingleton,那么每一个购物车的实例都是一样的,但是没有办法释放内存。

。 .所以你会看到 TyphoonScopeObjectGraph 加载一个具有共享实例的对象图,但允许在用例之后丢弃整个对象图。