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

Xamarin.iOS中NSCache存值正常但ObjectForKey始终返回null求解决

解决Xamarin.iOS中NSCache存值后取值返回null的问题

兄弟,我之前在Xamarin.iOS里用NSCache也踩过类似的坑,咱们一步步排查大概率能解决:

1. 最可能的原因:存值方法的拼写和参数顺序错误

看你贴的存值代码:

cacheProvider.SetObjectforKey(key, Value);

这里有两个致命问题:

  • 方法名拼写错误:NSCache的官方方法名是SetObjectForKey(for的首字母F是大写),你写的SetObjectforKey是小写f,这要么是编译错误(如果直接调用NSCache的方法),要么是你自己封装的方法没正确调用NSCache的存逻辑;
  • 参数顺序搞反了:NSCache的SetObjectForKey方法参数顺序是(要存的对象, Key),也就是SetObjectForKey(Value, key),你把Key和Value的位置写反了,相当于把Key当成值存了,自然用原Key取不出东西!

修正后的存值代码应该是:

public static void AddCachedString(NSString key, NSString Value) 
{ 
    cacheProvider.SetObjectForKey(Value, key); 
}

2. 确认cacheProvider是全局单例

NSCache是实例级缓存,如果你的cacheProvider是在每个方法里重新实例化的(比如每次调用AddCachedString都new一个NSCache),那存的内容只在当前实例里,下次取的时候用的是新实例,肯定拿不到值。

要确保它是全局唯一的实例:

// 定义成静态成员,全局复用
private static NSCache cacheProvider = new NSCache();

3. 验证Key的一致性

虽然NSString实现了NSCopying协议(NSCache要求Key必须遵循这个),但要保证存和取的Key内容完全一致:

  • 避免大小写、特殊字符、编码差异,比如存的时候是"UserID",取的时候写成"userid";
  • 尽量复用同一个NSString实例当Key,或者用NSString.FromString("固定字符串")来生成Key,避免每次创建新实例可能带来的匹配问题。

4. 排查NSCache的自动回收机制

NSCache会在系统内存不足时自动清理缓存项:

  • 先测试存完立刻调用取值方法,如果这时候也返回null,那肯定不是回收的问题;
  • 如果是过一段时间才返回null,可以调整缓存的限制参数,避免被过早回收:
    cacheProvider.CountLimit = 200; // 设置最大缓存项数量
    cacheProvider.TotalCostLimit = 1024 * 1024 * 10; // 设置最大缓存总大小(10MB)
    

按照上面的步骤排查,尤其是前两点,应该能解决你的问题!

内容的提问来源于stack exchange,提问作者Aya Saber

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:42:34