You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Objective-C:同VC保留变量值,切换VC后清除值的实现问题

解决同一VC内保留变量、切换VC后清除的问题

你的核心问题在于用了NSUserDefaults来存储sURLFromSearch——这是持久化存储,数据会一直保存在设备上,哪怕切换VC甚至重启APP都不会自动清除,完全不符合你“切换VC后清除值”的需求。

要实现「在My Classes VC内部保留变量值,离开这个VC(切换到其他VC比如Search VC)就清除」的效果,最直接的方案是:

方案1:用VC成员变量存储 + 生命周期方法控制清除

  1. 在My Classes VC的类扩展里定义成员变量(如果是Swift就是属性):
@interface MyClassesVC ()
@property (nonatomic, strong) NSString *sURLFromSearch;
@end
  1. 从Search VC传递字符串时,直接赋值给这个成员变量,彻底放弃NSUserDefaults:
// 假设Search VC跳转回My Classes VC的逻辑
MyClassesVC *classesVC = [[MyClassesVC alloc] init];
classesVC.sURLFromSearch = userInputSearchText;
[self.navigationController pushViewController:classesVC animated:YES];
  1. 利用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:19:49