0

次のようなモデル/サービス クラスを使用するクラスまたは ViewController があります。

@interface MainViewController : UIViewController <TweetServiceDelegate> {

   NSArray *_tweets;
}

@property (nonatomic, strong) TweetService *tweetService;

@end

@implementation MainViewController

- (void)viewDidLoad {

  [super viewDidLoad];
  [self.twitterService queryForLatestTweets];
}

// delegate methods the tweetservice calls back after async getting data

- (void)querySucceededWithTweets:(NSArray *)tweets {

   _tweets = [tweets copy];
}

@end

私が尋ねる理由は、Service が ViewController であるデリゲートへの弱い参照を持っているためです。

したがって、ARCでは、相互に使用する2つのものが両方に強い参照を持つことを望まないことを知っています。したがって、弱いがViewControllerがNSArrayを保持している場合、Serviceは範囲外になると収集されません。サービスは範囲外になりましたが、ViewController は範囲外になりませんでした

@interface TweetService 

@property (nonatomic, weak) id<TweetServiceDelegate> delegate;

@end

@implementation TweetService

- (void)queryForLatestTweets {

   // do the query with AFNetworking, when succeed block fires, call the delegate

   [self.delegate querySucceededWithTweets:arrayOfTweets];
}

@end
4

2 に答える 2

1

これはむしろ、この種のことを行うための推奨される方法だと思います。サービスは、それを必要とするコントローラーによって強力に保持されますが、機能するためにそのデリゲートが何であるか (存在する場合でも) を知る必要がないため、サービスはコントローラーをデリゲートとして弱く保持します。

サービスがデリゲート メソッドを介してデリゲートに何かを返す場合、デリゲートはデータの所有権を主張する必要があります。copyデリゲートは戻り値のライフサイクルについて何も知らないため、推奨される方法はです。copyデータの「スナップショット」と考えることができる新しいインスタンスを作成します。この「スナップショット」に取り組むことで、データが変更されたくないときにデータが変更されないことが保証されます。これにより、サービスとデリゲートが効果的に分離されます。

補足:はインスタンス変数であるself._tweetsため機能しません_tweetsが、ドット構文ではプロパティが必要です。_tweets = [tweets copy];正しいでしょう。

于 2012-12-15T06:01:21.140 に答える
0

はい、使用するのは良いことです...

その配列をコピーしない場合は、_tweet = tweet 配列を割り当てるだけです。

次に、配列のいずれかで変更を行っている場合、他の配列に影響します..

はい、そのような場合はCOPYメソッドを使用することをお勧めします...

ありがとう。

于 2012-12-15T12:58:03.020 に答える