新手日記
最近在開發(fā)的過程中遇到過一個(gè)這樣的問題 場景模擬如下: 在A.m中 @property(nonatomic, strong)dataModel *repeatModel; 然后在跳轉(zhuǎn)界面的時(shí)候把userinfo傳給兩位一個(gè)界面 userinfo = @{@"model":self.repeatModel};
在B.m中
@property(nonatomic, strong)dataModel * modelData; self.modelData = userinfo[@"model"];
然后就在修改self.modelData
再點(diǎn)擊保存把self.modelData返回給A.m中的repeatModel
問題就是,在B.m界面中,只要修改了modelData,還沒點(diǎn)擊保存,直接返回到A.m界面,A.m中的repeatModel值也會(huì)改變。
原因: 在A.m中repeatModel是strong對象,假設(shè)它的地址是0x222; 在B.m中modelData也是strong強(qiáng)引用,self.modelData = userinfo[@"model"];,相當(dāng)于把repeatModel賦給modelData,那么repeatModel和modelData指向同一地址,
所以只要一修改modelData,就是修改了地址0x222的內(nèi)容,由于repeatModel也指向0x222這一地址,所以repeatModel的內(nèi)容也隨即改變,這就是為什么還沒點(diǎn)擊保存,repeatModel的值也變化的原因。
解決方法 1。在B.m接收數(shù)據(jù)時(shí),改為 dataModeltempModel = intent.userinfo[@"model"]; self.modelData = [tempModel copy]; copy操作重新開辟了一個(gè)內(nèi)存地址,modelData和repeatModel就不是指向同一地址,修改modelData不會(huì)影響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也重新開辟了一個(gè)內(nèi)存地址