3

比方说,我有下面的代码

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

如果我使用TyphoonScopeObjectGraphfor customObj,它应该返回相同的实例。但是当我调试时,customObj属性与显示的不一样: 图片

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

您可以从这里获取项目源代码

4

1 回答 1

3

在上面的示例中,如果您希望self.customObjtemp3成为同一个实例,那么您需要TyphoonScopeSingletonor 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,那么将返回一个控制器,其中两者都MyViewControllerMyView具有相同的实例ShoppingCart

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

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

于 2015-01-22T11:31:55.490 回答