TyphoonScopeObjectGraph 的工作原理
How TyphoonScopeObjectGraph works
比方说,我有下面的代码
self.customObj = self.assembly.customObj() as? NSObject
let temp3 = self.assembly.customObj() as NSObject
如果我对 customObj
使用 TyphoonScopeObjectGraph
,它应该 return 是同一个实例。
但是当我调试时, customObj
属性与显示的不一样:
据我了解,customObj
和temp3
应该是同一个实例。但正如您在图中看到的,customObj
和 temp3
具有相同的 ObjectiveC.NSObject
地址,但其所有属性(_shortFormatter
、_longFormatter
)具有不同的地址。发生什么事?我们如何为 customObj
和 temp3
获得相同的实例。一个例子非常有帮助。
谢谢。
您可以从here
获取项目源代码
在上面的示例中,如果您希望 self.customObj
和 temp3
是同一个实例,那么您需要 TyphoonScopeSingleton
或 TyphoonScopeWeakSingleton
。
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
的实例,那么将返回一个控制器,其中 MyViewController
和 MyView
将具有相同的 [= 实例22=]
- 如果使用 TyphoonScopePrototype,那么每个都会有一个不同的实例
ShoppingCart
- 如果使用了TyphoonScopeSingleton,那么每一个购物车的实例都是一样的,但是没有办法释放内存。
。 .所以你会看到 TyphoonScopeObjectGraph
加载一个具有共享实例的对象图,但允许在用例之后丢弃整个对象图。
比方说,我有下面的代码
self.customObj = self.assembly.customObj() as? NSObject
let temp3 = self.assembly.customObj() as NSObject
如果我对 customObj
使用 TyphoonScopeObjectGraph
,它应该 return 是同一个实例。
但是当我调试时, customObj
属性与显示的不一样:
据我了解,customObj
和temp3
应该是同一个实例。但正如您在图中看到的,customObj
和 temp3
具有相同的 ObjectiveC.NSObject
地址,但其所有属性(_shortFormatter
、_longFormatter
)具有不同的地址。发生什么事?我们如何为 customObj
和 temp3
获得相同的实例。一个例子非常有帮助。
谢谢。
您可以从here
获取项目源代码在上面的示例中,如果您希望 self.customObj
和 temp3
是同一个实例,那么您需要 TyphoonScopeSingleton
或 TyphoonScopeWeakSingleton
。
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
的实例,那么将返回一个控制器,其中 MyViewController
和 MyView
将具有相同的 [= 实例22=]
- 如果使用 TyphoonScopePrototype,那么每个都会有一个不同的实例
ShoppingCart
- 如果使用了TyphoonScopeSingleton,那么每一个购物车的实例都是一样的,但是没有办法释放内存。
。 .所以你会看到 TyphoonScopeObjectGraph
加载一个具有共享实例的对象图,但允许在用例之后丢弃整个对象图。