新手日記
最近在開發(fā)的過程中遇到過一個這樣的問題 場景模擬如下: 在A.m中 @property(nonatomic, strong)dataModel *repeatModel; 然后在跳轉界面的時候把userinfo傳給兩位一個界面 userinfo = @{@"model":self.repeatModel};
在B.m中
@property(nonatomic, strong)dataModel * modelData; self.modelData = userinfo[@"model"];
然后就在修改self.modelData
再點擊保存把self.modelData返回給A.m中的repeatModel
問題就是,在B.m界面中鳖孤,只要修改了modelData近刘,還沒點擊保存,直接返回到A.m界面味赃,A.m中的repeatModel值也會改變。
原因: 在A.m中repeatModel是strong對象,假設它的地址是0x222; 在B.m中modelData也是strong強引用林艘,self.modelData = userinfo[@"model"];,相當于把repeatModel賦給modelData宪塔,那么repeatModel和modelData指向同一地址磁奖,
所以只要一修改modelData,就是修改了地址0x222的內(nèi)容某筐,由于repeatModel也指向0x222這一地址比搭,所以repeatModel的內(nèi)容也隨即改變,這就是為什么還沒點擊保存南誊,repeatModel的值也變化的原因身诺。
解決方法 1。在B.m接收數(shù)據(jù)時抄囚,改為 dataModeltempModel = intent.userinfo[@"model"]; self.modelData = [tempModel copy]; copy操作重新開辟了一個內(nèi)存地址霉赡,modelData和repeatModel就不是指向同一地址,修改modelData不會影響repeatModel 2.就是先在dataModel類繼承NSCopying協(xié)議幔托,重寫- (id)copyWithZone:(nullable NSZone)zone方法穴亏。比如
(id)copyWithZone:(nullable NSZone)zone{ BMTHTripRepeatModelmodel = [[BMTHTripRepeatModel alloc] init]; return model; }然后在B.m文件中@property(nonatomic, copy)dataModel * modelData; 這樣modelData也重新開辟了一個內(nèi)存地址