Objective-C:同VC保留变量值,切换VC后清除值的实现问题
解决同一VC内保留变量、切换VC后清除的问题
你的核心问题在于用了NSUserDefaults来存储sURLFromSearch——这是持久化存储,数据会一直保存在设备上,哪怕切换VC甚至重启APP都不会自动清除,完全不符合你“切换VC后清除值”的需求。
要实现「在My Classes VC内部保留变量值,离开这个VC(切换到其他VC比如Search VC)就清除」的效果,最直接的方案是:
方案1:用VC成员变量存储 + 生命周期方法控制清除
- 在My Classes VC的类扩展里定义成员变量(如果是Swift就是属性):
@interface MyClassesVC () @property (nonatomic, strong) NSString *sURLFromSearch; @end
- 从Search VC传递字符串时,直接赋值给这个成员变量,彻底放弃
NSUserDefaults:
// 假设Search VC跳转回My Classes VC的逻辑 MyClassesVC *classesVC = [[MyClassesVC alloc] init]; classesVC.sURLFromSearch = userInputSearchText; [self.navigationController pushViewController:classesVC animated:YES];
- 利用VC的生命周期方法,在离开VC时清除变量。比如在
viewWillDisappear:里判断场景后清空:
- (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; // 只有当是跳转到其他VC(而非从其他VC返回)时才清除 if (!self.isMovingFromParentViewController) { self.sURLFromSearch = nil; } }
这样一来,只要停留在My Classes VC内,sURLFromSearch的值会一直保留;一旦切换到其他VC,这个值就会被清空,完美匹配你的需求。
为什么NSUserDefaults不合适?
NSUserDefaults是用来存储需要持久化的配置类数据(比如用户偏好设置、记住密码状态),它的生命周期覆盖整个APP,除非你手动调用removeObjectForKey:删除,否则数据会一直存在。用它来存储临时的VC级别变量,属于用错了工具,这也是你遇到异常的根本原因。
补充:若必须兼容NSUserDefaults的方案
如果你因为历史代码限制不得不继续用NSUserDefaults,那需要手动在合适时机清除数据:
- 在My Classes VC的
viewWillDisappear:里执行清除:
[[NSUserDefaults standardUserDefaults] removeObjectForKey:@"txtURLFromSearch"]; [[NSUserDefaults standardUserDefaults] synchronize];
- 在
viewWillAppear:里读取值到成员变量,确保每次回到VC时能获取最新传递的数据。不过还是优先推荐方案1,更符合ViewController的设计逻辑。
内容的提问来源于stack exchange,提问作者Hanz Cheah
相关产品推荐
相关产品推荐

