簡體   English   中英

這是NSArray復制方法的好用法嗎?

[英]is this a good use of the copy method for an NSArray?

您有一個使用模型/服務類的類或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]; 是正確的。

我會說是的,很好用,因為...

如果您不復制該數組,則只需分配_tweet = tweet數組即可。

然后,如果您要更改任一陣列,它將影響其他陣列。

所以是的,我建議您在這種時候使用COPY方法...

謝謝。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM