您有一个使用模型/服务类的类或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时,您不希望两件事相互使用都具有强引用,因此,如果它很弱,但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
最佳答案
我会说这是做这种事情的推荐方法。该服务由需要它的控制器强健地保持,但是该服务仅作为控制器弱地持有该控制器,因为它不需要知道它的委托是什么(即使它存在)来起作用。
当服务通过委托方法将某些内容返回给其委托时,委托应声明数据所有权。首选方法是copy
,因为委托对返回值的生命周期一无所知。 copy
生成一个新实例,可以将其视为数据的“快照”。处理此“快照”可确保您在不希望修改数据时不会对其进行修改。这有效地使服务和委托分离。
注意:您的self._tweets
无法使用,因为_tweets
是实例变量,但是点语法需要一个属性。 _tweets = [tweets copy];
是正确的。