2017-05-04 2 views
0

を保持します。あなたが見ることができる何は、私は3つのクラスを有するサイクルと弱性

Core.m

-(id)init { 
    self = [super init]; 
    MyCache *cache = [[MyCache alloc] initWithCore:self]; 
    self.httpClient = [[MyHttpClient alloc] initWithCache:cache]; 
} 

Cache.m

@interface MyCache() 
    @property (nonatomic, strong) MyHttpClient *httpClient; 
@end 

@interface Core() 

@property (nonatomic, strong) MyHttpClient *httpClient; 

@end 

@implementation MyCache 
    -(instancetype) initWithCore: (Core *)core 
    { 
    if (self = [self init]) { 
     self.httpClient = core.httpClient; 
    } 
    return self; 
    } 
@end 

-(void)foo 
{ 
    [self.httpClient doSomething]; 
} 

MyHttpClient.m

@interface MyHttpClient : NSObject 

    @property (nonatomic, strong) MyCache *cache; 
    -(instancetype) initWithCache: (MyCache *)cache; 

@end 


@implementation MyHttpClient 

-(instancetype) initWithCache: (MyCache *)cache 
{ 
    if (self = [self init]) { 
     self.cache = cache; 
    } 
    return self; 
} 

-(void) doSomething 
{ 
    [self.cache cacheSomething]; 
} 

MyCacheMyHttpClientインスタンスを依存性注入によって使用し、一方でMyHttpClientインスタンスはMyCacheインスタンスを使用します。

これはという周期を保持していますか?

は私が弱いするMyCacheまたはMyHttpClientプロパティを設定する必要がありますか?あなたは、簡単な図にロジックを入れた場合

感謝、

+0

なぜキャッシュにhttpクライアントが必要なのですか?私は本当の問題はあなたが正しく懸念を分離していないことだと考えています... – Sulthan

+0

@Sulthan Cacheは、HttpClientを通してサーバーに送信する必要のあるオブジェクトのリストを持っています。 Httpclientでは、送信が完了すると、リストに格納されたオブジェクトをクリアするためにキャッシュを呼び出します。 – snaggs

+0

これはまさに私が話していることです。キャッシュはアイテムを単独で送信すべきではありません。あなたの他のクラスの1人は、アイテムのために 'Cache'を要求し、それらを送るべきです。 – Sulthan

答えて

6

。 HttpClientとCacheの間に保持サイクルがあることがわかります。キャッシュのhttpclientプロパティをweakに設定することが、保持サイクルを解決するのが最善であると思います。

Diagram

関連する問題