3

たとえば、私は以下のコードを持っています

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

TyphoonScopeObjectGraphforを使用するとcustomObj、同じインスタンスが返されるはずです。しかし、デバッグすると、customObjプロパティは示されているものと同じではありません: 画像

私が理解している限り、同じインスタンスである必要がありますcustomObjtemp3しかし、画像でわかるように、customObjtemp3は同じObjectiveC.NSObjectアドレスを持っていますが、そのすべてのプロパティ ( _shortFormatter_longFormatter) は異なるアドレスを持っています。何が起きましたか?customObjとの同じインスタンスを取得する方法temp3。例は非常に役に立ちます。ありがとう。

プロジェクトのソースコードはこちらから入手できます

4

1 に答える 1

3

上記の例で、 と を同じインスタンスにしたい場合self.customObjtemp3、 または のいずれかが必要TyphoonScopeSingletonですTyphoonScopeWeakSingleton

解決中に2 つのインスタンスが という別のコンポーネントに依存していると宣言すると、TyphoonScopeObjectGraphの同じ共有インスタンスが返されます。ただし、これらは Typhoon によって保持されません。そのため、オブジェクト グラフ全体 (たとえば、ビュー コントローラーと依存関係) を読み込み、完了したらそれを破棄することができます。また、コントローラーを指すデリゲート プロパティを持つ、コントローラーやビューなどの循環依存関係を持つ場合にも役立ちます。contextcontextTyphoonScopeObjectGraph

例を挙げて説明すると役に立ちます:

@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コントローラーが返されます。MyViewControllerMyViewShoppingCart

  • TyphoonScopePrototype が使用された場合、それぞれに異なるインスタンスが含まれます。ShoppingCart
  • TyphoonScopeSingleton が使用された場合、それぞれが同じショッピング カートのインスタンスを持つことになりますが、メモリを解放する方法はありません。

. . そのためTyphoonScopeObjectGraph、共有インスタンスを含むオブジェクト グラフが読み込まれますが、ユース ケースの後でそのオブジェクト グラフ全体を破棄できます。

于 2015-01-22T11:31:55.490 に答える