这是一个很好地利用NSArray的复制方法吗?

时间:2012-12-15 05:39:00

标签: objective-c ios automatic-ref-counting

你有一个使用模型/服务类的类或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

2 个答案:

答案 0 :(得分:1)

我会说这是推荐的做这种事情的方式。该服务由需要它的控制器强烈保存,但该服务仅将控制器作为委托进行弱处理,因为它不需要知道它的委托是什么 - 或者即使它存在 - 也能运行。

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

附注:您的self._tweets无效,因为_tweets是一个实例变量,但点语法需要一个属性。 _tweets = [tweets copy];是正确的。

答案 1 :(得分:0)

我会说是的,使用是好的,因为......

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

然后,如果您在任何一个数组中进行更改,它将影响到其他数组..

所以是的我会建议你这样使用COPY方法......

感谢。