strong 强引用引发的数值变化问题

新手日记

最近在开发的过程中遇到过一个这样的问题 场景模拟如下: 在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的内容,由于repeatModel也指向0x222这一地址,所以repeatModel的内容也随即改变,这就是为什么还没点击保存,repeatModel的值也变化的原因。

解决方法 1。在B.m接收数据时,改为 dataModeltempModel = intent.userinfo[@"model"]; self.modelData = [tempModel copy]; copy操作重新开辟了一个内存地址,modelData和repeatModel就不是指向同一地址,修改modelData不会影响repeatModel 2.就是先在dataModel类继承NSCopying协议,重写- (id)copyWithZone:(nullable NSZone)zone方法。比如

(id)copyWithZone:(nullable NSZone)zone{ BMTHTripRepeatModelmodel = [[BMTHTripRepeatModel alloc] init]; return model; }然后在B.m文件中@property(nonatomic, copy)dataModel * modelData; 这样modelData也重新开辟了一个内存地址

你可能感兴趣的:(strong 强引用引发的数值变化问题)