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
相关产品推荐
相关产品推荐

