新手日记
最近在开发的过程中遇到过一个这样的问题 场景模拟如下: 在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也重新开辟了一个内存地址