Objective c 对于NSArray,这是复制方法的一个好用法吗?

Objective c 对于NSArray,这是复制方法的一个好用法吗?,objective-c,ios,automatic-ref-counting,Objective C,Ios,Automatic Ref Counting,您有一个使用模型/服务类的类或ViewController,如下所示: @interface MainViewController : UIViewController <TweetServiceDelegate> { NSArray *_tweets; } @property (nonatomic, strong) TweetService *tweetService; @end @implementation MainViewController - (void)

您有一个使用模型/服务类的类或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
@interface MainViewController:UIViewController{
NSArray*_推特;
}
@属性(非原子,强)TweetService*TweetService;
@结束
@实现主视图控制器
-(无效)viewDidLoad{
[超级视图下载];
[self.twitterService queryForLatestTweets];
}
//tweetservice在异步获取数据后回调的委托方法
-(无效)QuerySucceedWithTweets:(NSArray*)tweets{
_tweets=[tweets copy];
}
@结束
我之所以问这个问题,是因为服务对代理(即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
@接口TweetService
@属性(非原子,弱)id委托;
@结束
@实现tweet服务
-(无效)queryForLatestTweets{
//使用AFNetworking执行查询,当成功块触发时,调用代理
[self.delegate querySucceededWithTweets:arrayOfTweets];
}
@结束

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

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


旁注:您的
self.\u tweets
不起作用,因为
\u tweets
是一个实例变量,但点语法需要一个属性<代码>\u tweets=[tweets copy]是正确的。

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

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

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

所以是的,我会建议你在这样的时候使用复制的方法


谢谢。

啊,你说得对,我没有使用真正的代码,因为我有太多的产品代码需要复制、编辑等等,我只是在帖子中写出来,谢谢。我想唯一没有回答的问题是,如果我没有使用复制,只是将推文设置为来自该服务的推文,会发生什么?