strong 強(qiáng)引用引發(fā)的數(shù)值變化問題

新手日記

最近在開發(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)存地址

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容