最完整MMKV使用指南:从初始化到高级特性全攻略
MMKV是腾讯开源的高性能键值对存储组件,基于mmap(内存映射)和protobuf(Protocol Buffers)实现,具有高速、紧凑和易用的特点。自2015年起在微信客户端大规模使用,目前已支持Android、iOS/macOS、Windows、POSIX和HarmonyOS NEXT等多平台。本文将从基础初始化到高级特性,全面讲解MMKV的使用方法,帮助开发者快速掌握这一高效存储方案。
MMKV核心优势解析
MMKV之所以能在众多存储方案中脱颖而出,核心在于其独特的技术架构和设计理念,主要优势包括:
极致性能表现
MMKV采用mmap内存映射技术,将文件直接映射到进程地址空间,实现内存与磁盘的自动同步,避免了传统IO操作的性能开销。数据序列化使用protobuf协议,兼顾了性能和空间效率。在写入性能上,MMKV相比SharedPreferences等传统方案有数量级提升,尤其在高频写入场景下优势明显。
多平台无缝支持
MMKV提供了统一的API接口,同时支持Android、iOS/macOS、Windows、POSIX和HarmonyOS NEXT等主流平台,便于跨平台项目的开发和维护。各平台实现细节对开发者透明,降低了跨平台存储方案的学习和使用成本。
简洁易用的API
MMKV的API设计简洁直观,所有数据变更即时生效,无需调用sync或apply方法。提供了丰富的数据类型支持,包括基本数据类型(布尔值、整数、浮点数等)和复杂数据类型(字符串、二进制数据等),满足各种存储需求。
可靠的数据安全
MMKV内置了数据校验机制,通过CRC32校验确保数据完整性。支持数据加密功能,可对敏感数据进行加密存储,保护用户隐私。同时,MMKV的内存映射机制确保了在应用异常崩溃时数据的安全性,避免数据丢失或损坏。
环境准备与安装
MMKV提供了多种安装方式,可根据不同平台和项目需求选择合适的方式。
Android平台
Android平台推荐使用Maven方式引入MMKV,在项目的build.gradle文件中添加以下依赖:
dependencies {
implementation 'com.tencent:mmkv:2.2.4'
// 请将"2.2.4"替换为最新版本号
}
注意:从v2.0.0版本开始,MMKV不再支持32位架构和API level 22及以下版本。如果需要支持这些环境,请使用v1.3.x LTS版本。
详细的Android平台安装指南可参考Android Setup。
iOS/macOS平台
iOS/macOS平台推荐使用CocoaPods进行安装,步骤如下:
-
确保已安装CocoaPods,如未安装,可通过以下命令安装:
sudo gem install cocoapods -
在项目目录下创建或编辑Podfile,添加以下内容:
target 'YourTargetName' do pod 'MMKV' end -
执行以下命令安装MMKV:
pod install -
使用Xcode打开生成的
.xcworkspace文件,在需要使用MMKV的文件中导入头文件:#import <MMKV/MMKV.h>
详细的iOS/macOS平台安装指南可参考iOS/macOS Setup。
Windows平台
Windows平台可通过源码方式集成,步骤如下:
-
克隆MMKV仓库:
git clone https://link.gitcode.com/i/e3789eb1acdf63e29c10dd393b85f386.git -
将
Core/core.vcxproj工程添加到你的解决方案中。 -
设置你的主工程依赖于MMKV工程。
-
配置项目属性:
- 在
C/C++->常规->附加包含目录中添加$(OutDir)include - 在
链接器->常规->附加库目录中添加$(OutDir) - 在
链接器->输入->附加依赖项中添加mmkv.lib
- 在
-
在代码中包含头文件:
#include <MMKV/MMKV.h>
详细的Windows平台安装指南可参考Windows Setup。
HarmonyOS NEXT平台
HarmonyOS NEXT平台推荐使用OHPM(OpenHarmony Package Manager)安装,执行以下命令:
ohpm install @tencent/mmkv
安装完成后,在代码中导入MMKV模块即可使用:
import { MMKV } from '@tencent/mmkv';
详细的HarmonyOS NEXT平台安装指南可参考HarmonyOS NEXT Setup。
快速入门:MMKV基础使用
MMKV的使用流程简单直观,主要包括初始化和基本的键值对操作。
初始化MMKV
在应用启动时,需要对MMKV进行初始化,设置MMKV的根目录。不同平台的初始化方式略有差异:
Android平台
在Application类的onCreate方法中初始化MMKV:
import com.tencent.mmkv.MMKV;
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
String rootDir = MMKV.initialize(this);
System.out.println("MMKV根目录:" + rootDir);
}
}
初始化完成后,MMKV会在应用的files/mmkv/目录下存储数据文件。
iOS/macOS平台
在AppDelegate的application:didFinishLaunchingWithOptions:方法中初始化MMKV:
#import <MMKV/MMKV.h>
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// 在主线程初始化MMKV
[MMKV initializeMMKV:nil];
return YES;
}
@end
如果需要自定义存储路径,可传入指定路径:
NSString *docsDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
NSString *mmkvPath = [docsDir stringByAppendingPathComponent:@"mmkv"];
[MMKV initializeMMKV:mmkvPath];
Windows平台
在应用入口函数(如main)中初始化MMKV:
#include <MMKV/MMKV.h>
#include <filesystem>
namespace fs = std::filesystem;
int main() {
fs::path appDataPath = getenv("APPDATA");
fs::path mmkvPath = appDataPath / "MyApp" / "mmkv";
MMKV::initializeMMKV(mmkvPath.wstring());
return 0;
}
HarmonyOS NEXT平台
在EntryAbility的onCreate方法中初始化MMKV:
import { MMKV } from '@tencent/mmkv';
export default class EntryAbility extends UIAbility {
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
let appCtx = this.context.getApplicationContext();
let mmkvRootDir = MMKV.initialize(appCtx);
console.info('MMKV根目录:', mmkvRootDir);
}
}
获取MMKV实例
MMKV提供了一个全局默认实例,可通过defaultMMKV方法获取:
Android平台
MMKV kv = MMKV.defaultMMKV();
iOS/macOS平台
MMKV *mmkv = [MMKV defaultMMKV];
Windows/POSIX平台
auto mmkv = MMKV::defaultMMKV();
HarmonyOS NEXT平台
let mmkv = MMKV.defaultMMKV();
如果需要创建多个独立的存储实例,可使用mmkvWithID方法:
Android平台
// 创建名为"user_info"的存储实例,支持多进程访问
MMKV userKV = MMKV.mmkvWithID("user_info", MMKV.MULTI_PROCESS_MODE);
iOS/macOS平台
// 创建名为"user_info"的存储实例,支持多进程访问
MMKV *userKV = [MMKV mmkvWithID:@"user_info" mode:MMKV_MULTI_PROCESS];
Windows/POSIX平台
// 创建名为"user_info"的存储实例,支持多进程访问
auto userKV = MMKV::mmkvWithID("user_info", MMKV_MULTI_PROCESS);
HarmonyOS NEXT平台
// 创建名为"user_info"的存储实例,支持多进程访问
let userKV = MMKV.mmkvWithID("user_info", MMKV.MULTI_PROCESS_MODE);
基本数据操作
MMKV支持多种数据类型的存储,包括布尔值、整数、浮点数、字符串和二进制数据等。
写入数据
Android平台
// 存储布尔值
kv.encode("is_first_launch", true);
// 存储整数
kv.encode("user_age", 25);
// 存储长整数
kv.encode("timestamp", System.currentTimeMillis());
// 存储浮点数
kv.encode("temperature", 36.5f);
// 存储双精度浮点数
kv.encode("pi", Math.PI);
// 存储字符串
kv.encode("username", "张三");
// 存储二进制数据
byte[] imageData = ...; // 从文件或网络获取的二进制数据
kv.encode("avatar", imageData);
iOS/macOS平台
// 存储布尔值
[mmkv setBool:YES forKey:@"is_first_launch"];
// 存储32位整数
[mmkv setInt32:25 forKey:@"user_age"];
// 存储64位整数
[mmkv setInt64:[[NSDate date] timeIntervalSince1970] * 1000 forKey:@"timestamp"];
// 存储浮点数
[mmkv setFloat:36.5f forKey:@"temperature"];
// 存储双精度浮点数
[mmkv setDouble:M_PI forKey:@"pi"];
// 存储字符串
[mmkv setString:@"张三" forKey:@"username"];
// 存储二进制数据
NSData *imageData = ...; // 从文件或网络获取的二进制数据
[mmkv setData:imageData forKey:@"avatar"];
Windows/POSIX平台
// 存储布尔值
mmkv->set(true, "is_first_launch");
// 存储32位整数
mmkv->set(25, "user_age");
// 存储64位整数
int64_t timestamp = std::chrono::duration_cast<std::chrono::milliseconds>(
std::chrono::system_clock::now().time_since_epoch()).count();
mmkv->set(timestamp, "timestamp");
// 存储浮点数
mmkv->set(36.5f, "temperature");
// 存储双精度浮点数
mmkv->set(M_PI, "pi");
// 存储字符串
mmkv->set("张三", "username");
// 存储二进制数据
std::vector<uint8_t> imageData = ...; // 从文件或网络获取的二进制数据
mmkv->set(imageData.data(), imageData.size(), "avatar");
HarmonyOS NEXT平台
// 存储布尔值
mmkv.encodeBool('is_first_launch', true);
// 存储32位整数
mmkv.encodeInt32('user_age', 25);
// 存储64位整数
mmkv.encodeInt64('timestamp', BigInt(Date.now()));
// 存储浮点数
mmkv.encodeFloat('temperature', 36.5);
// 存储双精度浮点数
mmkv.encodeDouble('pi', Math.PI);
// 存储字符串
mmkv.encodeString('username', '张三');
// 存储二进制数据
let imageData: ArrayBuffer = ...; // 从文件或网络获取的二进制数据
mmkv.encodeBytes('avatar', imageData);
读取数据
Android平台
// 读取布尔值,默认值为false
boolean isFirstLaunch = kv.decodeBool("is_first_launch", false);
// 读取整数,默认值为0
int userAge = kv.decodeInt("user_age", 0);
// 读取长整数,默认值为0
long timestamp = kv.decodeLong("timestamp", 0);
// 读取浮点数,默认值为0.0f
float temperature = kv.decodeFloat("temperature", 0.0f);
// 读取双精度浮点数,默认值为0.0
double pi = kv.decodeDouble("pi", 0.0);
// 读取字符串,默认值为null
String username = kv.decodeString("username", null);
// 读取二进制数据,默认值为null
byte[] avatar = kv.decodeBytes("avatar", null);
iOS/macOS平台
// 读取布尔值,默认值为NO
BOOL isFirstLaunch = [mmkv getBoolForKey:@"is_first_launch" defaultValue:NO];
// 读取32位整数,默认值为0
int32_t userAge = [mmkv getInt32ForKey:@"user_age" defaultValue:0];
// 读取64位整数,默认值为0
int64_t timestamp = [mmkv getInt64ForKey:@"timestamp" defaultValue:0];
// 读取浮点数,默认值为0.0f
float temperature = [mmkv getFloatForKey:@"temperature" defaultValue:0.0f];
// 读取双精度浮点数,默认值为0.0
double pi = [mmkv getDoubleForKey:@"pi" defaultValue:0.0];
// 读取字符串,默认值为nil
NSString *username = [mmkv getStringForKey:@"username" defaultValue:nil];
// 读取二进制数据,默认值为nil
NSData *avatar = [mmkv getDataForKey:@"avatar" defaultValue:nil];
Windows/POSIX平台
// 读取布尔值,默认值为false
bool isFirstLaunch = mmkv->getBool("is_first_launch", false);
// 读取32位整数,默认值为0
int32_t userAge = mmkv->getInt32("user_age", 0);
// 读取64位整数,默认值为0
int64_t timestamp = mmkv->getInt64("timestamp", 0);
// 读取浮点数,默认值为0.0f
float temperature = mmkv->getFloat("temperature", 0.0f);
// 读取双精度浮点数,默认值为0.0
double pi = mmkv->getDouble("pi", 0.0);
// 读取字符串,默认值为空字符串
std::string username;
mmkv->getString("username", username);
// 读取二进制数据
MMBuffer avatar = mmkv->getBytes("avatar");
if (avatar.length() > 0) {
// 处理二进制数据
}
HarmonyOS NEXT平台
// 读取布尔值,默认值为false
let isFirstLaunch: boolean = mmkv.decodeBool('is_first_launch', false);
// 读取32位整数,默认值为0
let userAge: number = mmkv.decodeInt32('user_age', 0);
// 读取64位整数,默认值为0n
let timestamp: bigint = mmkv.decodeInt64('timestamp', BigInt(0));
// 读取浮点数,默认值为0.0
let temperature: number = mmkv.decodeFloat('temperature', 0.0);
// 读取双精度浮点数,默认值为0.0
let pi: number = mmkv.decodeDouble('pi', 0.0);
// 读取字符串,默认值为空字符串
let username: string = mmkv.decodeString('username', '');
// 读取二进制数据
let avatar: ArrayBuffer | null = mmkv.decodeBytes('avatar');
if (avatar) {
// 处理二进制数据
}
删除数据
Android平台
// 删除指定键的数据
kv.removeValueForKey("user_age");
// 删除多个键的数据
kv.removeValuesForKeys(new String[]{"username", "avatar"});
// 清除所有数据
kv.clearAll();
iOS/macOS平台
// 删除指定键的数据
[mmkv removeValueForKey:@"user_age"];
// 删除多个键的数据
[mmkv removeValuesForKeys:@[@"username", @"avatar"]];
// 清除所有数据
[mmkv clearAll];
Windows/POSIX平台
// 删除指定键的数据
mmkv->removeValueForKey("user_age");
// 删除多个键的数据
std::vector<std::string> keys = {"username", "avatar"};
mmkv->removeValuesForKeys(keys);
// 清除所有数据
mmkv->clearAll();
HarmonyOS NEXT平台
// 删除指定键的数据
mmkv.removeValueForKey('user_age');
// 删除多个键的数据
mmkv.removeValuesForKeys(['username', 'avatar']);
// 清除所有数据
mmkv.clearAll();
其他常用操作
判断键是否存在
Android平台
boolean hasKey = kv.containsKey("username");
iOS/macOS平台
BOOL hasKey = [mmkv containsKey:@"username"];
Windows/POSIX平台
bool hasKey = mmkv->containsKey("username");
HarmonyOS NEXT平台
let hasKey: boolean = mmkv.containsKey('username');
获取所有键
Android平台
String[] allKeys = kv.allKeys();
iOS/macOS平台
NSArray<NSString *> *allKeys = [mmkv allKeys];
Windows/POSIX平台
std::vector<std::string> allKeys = mmkv->allKeys();
HarmonyOS NEXT平台
let allKeys: string[] = mmkv.allKeys();
高级特性与最佳实践
MMKV提供了许多高级特性,可满足复杂的业务需求。合理使用这些特性可以进一步提升应用性能和数据安全性。
多进程访问
MMKV支持多进程并发访问,包括读-读并发和读-写并发。在创建MMKV实例时,指定多进程模式即可:
Android平台
// 创建支持多进程访问的实例
MMKV multiProcessKV = MMKV.mmkvWithID("multi_process", MMKV.MULTI_PROCESS_MODE);
iOS/macOS平台
// 创建支持多进程访问的实例
MMKV *multiProcessKV = [MMKV mmkvWithID:@"multi_process" mode:MMKV_MULTI_PROCESS];
Windows/POSIX平台
// 创建支持多进程访问的实例
auto multiProcessKV = MMKV::mmkvWithID("multi_process", MMKV_MULTI_PROCESS);
HarmonyOS NEXT平台
// 创建支持多进程访问的实例
let multiProcessKV = MMKV.mmkvWithID("multi_process", MMKV.MULTI_PROCESS_MODE);
注意:多进程访问会带来一定的性能开销,非必要情况下建议使用单进程模式。
数据加密
MMKV支持对数据进行加密存储,保护敏感信息。在创建MMKV实例时,可指定加密密钥:
Android平台
// 使用16字节的密钥进行加密
byte[] key = "MySecretKey_12345".getBytes(); // 密钥长度建议为16、24或32字节
MMKV encryptedKV = MMKV.mmkvWithID("encrypted_data", MMKV.SINGLE_PROCESS_MODE, key);
iOS/macOS平台
// 使用16字节的密钥进行加密
NSString *key = @"MySecretKey_12345"; // 密钥长度建议为16、24或32字节
MMKV *encryptedKV = [MMKV mmkvWithID:@"encrypted_data" mode:MMKV_SINGLE_PROCESS cryptKey:key];
Windows/POSIX平台
// 使用16字节的密钥进行加密
std::string key = "MySecretKey_12345"; // 密钥长度建议为16、24或32字节
auto encryptedKV = MMKV::mmkvWithID("encrypted_data", MMKV_SINGLE_PROCESS, key);
HarmonyOS NEXT平台
// 使用16字节的密钥进行加密
let key: string = "MySecretKey_12345"; // 密钥长度建议为16、24或32字节
let encryptedKV = MMKV.mmkvWithID("encrypted_data", MMKV.SINGLE_PROCESS_MODE, key);
MMKV使用AES-256算法对数据进行加密,确保数据在存储和传输过程中的安全性。加密密钥由用户自行管理,MMKV不会存储密钥,因此请妥善保管密钥,避免丢失。
自定义存储路径
MMKV默认使用应用的私有目录存储数据文件,也可以自定义存储路径:
Android平台
// 获取应用的外部存储目录
File externalDir = getExternalFilesDir(null);
String customPath = externalDir.getAbsolutePath() + "/mmkv_data";
// 初始化MMKV时指定自定义路径
MMKV.initialize(customPath);
iOS/macOS平台
// 获取应用的文档目录
NSString *docsDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
NSString *customPath = [docsDir stringByAppendingPathComponent:@"mmkv_data"];
// 初始化MMKV时指定自定义路径
[MMKV initializeMMKV:customPath];
Windows平台
// 自定义存储路径
std::wstring customPath = L"C:\\MyApp\\mmkv_data";
// 初始化MMKV时指定自定义路径
MMKV::initializeMMKV(customPath);
HarmonyOS NEXT平台
// 获取应用的文档目录
let context = ...; // 获取应用上下文
let docsDir = context.filesDir;
let customPath = path.join(docsDir, 'mmkv_data');
// 初始化MMKV时指定自定义路径
MMKV.initializeWithPath(context, customPath);
性能优化建议
为充分发挥MMKV的性能优势,建议遵循以下最佳实践:
-
减少频繁写入操作:虽然MMKV性能优异,但频繁的写入操作仍会消耗系统资源。对于需要频繁更新的数据,可考虑批量更新或使用内存缓存,定期同步到MMKV。
-
合理使用多进程模式:多进程模式会带来一定的性能开销,仅在必要时使用。如果应用中只有一个进程访问MMKV,建议使用单进程模式。
-
避免存储过大数据:MMKV适用于存储小到中等规模的数据,如配置信息、用户偏好等。对于大型数据(如图片、视频等),建议使用文件系统存储,MMKV中仅保存文件路径。
-
合理设置MMKV实例:对于不同模块的数据,可创建多个MMKV实例分开存储,避免单个文件过大,提高操作效率。
-
定期优化数据文件:MMKV采用追加写入的方式更新数据,长期使用后可能导致文件碎片化。可定期调用
trim方法优化数据文件:
Android平台
kv.trim();
iOS/macOS平台
[mmkv trim];
Windows/POSIX平台
mmkv->trim();
HarmonyOS NEXT平台
mmkv.trim();
数据迁移
如果需要从其他存储方案(如SharedPreferences、NSUserDefaults等)迁移到MMKV,可参考以下方法:
Android平台(从SharedPreferences迁移)
// 获取旧的SharedPreferences
SharedPreferences sp = getSharedPreferences("old_sp", MODE_PRIVATE);
// 获取所有键值对
Map<String, ?> all = sp.getAll();
if (all != null && !all.isEmpty()) {
MMKV kv = MMKV.mmkvWithID("migrated_data");
// 批量写入MMKV
for (Map.Entry<String, ?> entry : all.entrySet()) {
String key = entry.getKey();
Object value = entry.getValue();
if (value instanceof Boolean) {
kv.encode(key, (Boolean) value);
} else if (value instanceof Integer) {
kv.encode(key, (Integer) value);
} else if (value instanceof Long) {
kv.encode(key, (Long) value);
} else if (value instanceof Float) {
kv.encode(key, (Float) value);
} else if (value instanceof String) {
kv.encode(key, (String) value);
}
}
// 迁移完成后,可删除旧的SharedPreferences数据
sp.edit().clear().apply();
}
iOS平台(从NSUserDefaults迁移)
// 获取旧的NSUserDefaults
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
// 获取所有键值对
NSDictionary *all = [defaults dictionaryRepresentation];
if (all.count > 0) {
MMKV *kv = [MMKV mmkvWithID:@"migrated_data"];
// 批量写入MMKV
[all enumerateKeysAndObjectsUsingBlock:^(NSString *key, id obj, BOOL *stop) {
if ([obj isKindOfClass:[NSNumber class]]) {
NSNumber *num = (NSNumber *)obj;
if (strcmp(num.objCType, @encode(BOOL)) == 0) {
[kv setBool:num.boolValue forKey:key];
} else if (strcmp(num.objCType, @encode(int)) == 0) {
[kv setInt32:num.intValue forKey:key];
} else if (strcmp(num.objCType, @encode(long long)) == 0) {
[kv setInt64:num.longLongValue forKey:key];
} else if (strcmp(num.objCType, @encode(float)) == 0) {
[kv setFloat:num.floatValue forKey:key];
} else if (strcmp(num.objCType, @encode(double)) == 0) {
[kv setDouble:num.doubleValue forKey:key];
}
} else if ([obj isKindOfClass:[NSString class]]) {
[kv setString:obj forKey:key];
}
}];
// 迁移完成后,可删除旧的NSUserDefaults数据
[defaults removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]];
[defaults synchronize];
}
常见问题与解决方案
在使用MMKV过程中,可能会遇到一些常见问题,以下是解决方案:
数据丢失问题
问题描述:应用崩溃或设备重启后,部分数据丢失。
解决方案:
- MMKV使用mmap机制,数据会定期同步到磁盘。如果需要确保数据立即写入磁盘,可调用
sync方法:
Android平台
kv.sync();
iOS/macOS平台
[mmkv sync];
Windows/POSIX平台
mmkv->sync();
HarmonyOS NEXT平台
mmkv.sync();
- 检查是否在多进程模式下使用MMKV,如果是,请确保所有进程都使用多进程模式打开MMKV实例。
性能问题
问题描述:在某些场景下,MMKV的读写性能未达预期。
解决方案:
- 检查是否频繁操作大量小数据,可考虑批量操作或使用内存缓存。
- 避免在主线程进行大量MMKV操作,建议将耗时操作放在后台线程执行。
- 检查是否使用了加密功能,加密解密会带来一定的性能开销,非敏感数据建议不使用加密。
- 定期调用
trim方法优化数据文件,减少文件碎片化。
多进程同步问题
问题描述:多进程场景下,一个进程修改数据后,其他进程无法立即读取到最新数据。
解决方案:
- 确保所有进程都使用多进程模式打开MMKV实例。
- MMKV的多进程同步依赖于文件系统的通知机制,在某些系统上可能存在延迟。如果需要实时同步,可考虑使用其他进程间通信方式(如AIDL、Socket等)配合MMKV使用。
数据迁移问题
问题描述:从其他存储方案迁移到MMKV后,部分数据无法正确读取。
解决方案:
- 检查数据类型是否匹配,确保迁移过程中数据类型转换正确。
- 对于复杂数据类型(如自定义对象),需要先序列化为字符串或二进制数据再存储。
- 迁移完成后,建议验证部分关键数据,确保迁移正确。
总结
MMKV作为一款高性能的键值对存储组件,凭借其出色的性能、简洁的API和跨平台特性,已成为移动应用开发中的理想选择。本文从环境准备、基础使用到高级特性,全面介绍了MMKV的使用方法和最佳实践。
通过本文的学习,你应该能够:
- 在不同平台上正确安装和配置MMKV
- 熟练使用MMKV进行基本的键值对操作
- 掌握MMKV的高级特性,如多进程访问、数据加密等
- 遵循最佳实践,优化MMKV的使用性能
- 解决使用过程中可能遇到的常见问题
MMKV的源码托管在MMKV仓库,如果你在使用过程中遇到问题或有改进建议,欢迎提交issue或Pull Request参与项目贡献。
希望本文能帮助你更好地理解和使用MMKV,提升应用的性能和用户体验。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



