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

我问的原因是因为服务对委托的引用很弱,也就是 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
4

2 回答 2

1

我会说这是做这类事情的推荐方式。服务由需要它的控制器强烈持有,但服务仅将控制器作为委托弱持有,因为它不需要知道它的委托是什么——或者即使它存在——来运行。

当服务通过委托方法将某些内容返回给其委托时,委托应声明数据的所有权。首选方式是 to copy,因为委托对返回值的生命周期一无所知。copy创建一个新实例,可以将其视为数据的“快照”。处理此“快照”可确保您的数据在您不希望时不会被修改。这有效地解耦了服务和委托。

附注:你self._tweets不会工作,因为_tweets它是一个实例变量,但点语法需要一个属性。_tweets = [tweets copy];会是正确的。

于 2012-12-15T06:01:21.140 回答
0

我会说是的,它很好用,因为......

如果您不复制该数组,只需简单地分配 _tweet = tweet 数组。

那么如果你在任何一个阵列中进行更改,它将影响到其他阵列..

所以是的,我建议你在这种时候使用 COPY 方法......

谢谢。

于 2012-12-15T12:58:03.020 回答