你有一个使用模型/服务类的类或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,那么一旦它退出服务就不会被收集范围,假设服务确实超出了范围,但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
答案 0 :(得分:1)
我会说这是推荐的做这种事情的方式。该服务由需要它的控制器强烈保存,但该服务仅将控制器作为委托进行弱处理,因为它不需要知道它的委托是什么 - 或者即使它存在 - 也能运行。
当服务通过委托方法将某些内容返回给其委托时,委托应声明数据的所有权。首选方法是copy
,因为委托对返回值的生命周期一无所知。 copy
创建了一个可以被视为数据“快照”的新实例。处理此“快照”可确保在您不希望数据时不会修改数据。这有效地解耦了服务和代理。
附注:您的self._tweets
无效,因为_tweets
是一个实例变量,但点语法需要一个属性。 _tweets = [tweets copy];
是正确的。
答案 1 :(得分:0)
我会说是的,使用是好的,因为......
如果您不复制该数组,只需分配_tweet = tweet数组。
然后,如果您在任何一个数组中进行更改,它将影响到其他数组..
所以是的我会建议你这样使用COPY方法......
感谢。