tencent / mmkv Goto Github PK
View Code? Open in Web Editor NEWAn efficient, small mobile key-value storage framework developed by WeChat. Works on Android, iOS, macOS, Windows, and POSIX.
License: Other
An efficient, small mobile key-value storage framework developed by WeChat. Works on Android, iOS, macOS, Windows, and POSIX.
License: Other
This is a great frameworks to solve the key-value read/write problems, and has great performance comparing to NSUserDefaults and SQLite。It use the mmap, protobuf and some elegant strategies。
My question is your idea is base on the NSUserDefaults's poor performance is due to synchronize call, but from apple, synchronize will be deprecated and should be remove the synchronize call. (synchronize is deprecated and will be marked with the NS_DEPRECATED macro in a future release.)
想问下,mmkv是否是线程安全的?
If we write some data of type A
and read it as type B
with the same key, unexpected value will be returned. For example:
MMKV kv = MMKV.mmkvWithID(mmapID, MMKV.SINGLE_PROCESS_MODE, cryptKey);
kv.encode("bool", true);
int val = kv.decodeInt("bool", 100);
System.out.println("decode int with key bool: " + val);
The terminal will print decode int with key bool: 1
. That is kind of misleading since we never store any int
value with key "bool"
, meanwhile there was no error or exception thrown when we are doing this implicit casting.
Is this an intentional design?
An efficient, samll mobile key-value storage framework developed by WeChat. Works on iOS and Android.
samll -> small ?
Swift 语言可以使用吗?
I always error "fail to mlock crc [mmkv.default]-0x1041b8000, 12:Cannot allocate memory"
e.g. Objective-C, Swift, Java, or Kotlin
e.g. v1.0.10
e.g. iOS or Android
e.g. Cocoapods, Carthage, Maven, AAR Package or Git clone
Post the outputs or screenshots for errors.
Explain what you want by example or code in English.
jnilibs take up a lot of space, and Can I remove some of them?
void CodedOutputData::writeInt32(int32_t value) { if (value >= 0) { this->writeRawVarint32(value); } else { this->writeRawVarint64(value); } }
不明白为什么要采用现在这种压缩方法。
zigzag 压缩负数的效率应该比 writeRawVarint64 的实现要好一些
日常开发经常会遇到对存储数据变化监听,mmkv支持数据监听吗?
可以用MMKV保存一些个人隐私的数据吗? 比如邮箱、密码之类的 (类似KeyChian)
Java & Kotlin
v1.0.10
Android
Git clone
不知道MMKV 是否支持 共享SharedPreference?
eg. A App 想要访问 B App 的数据
看了下只支持api16以上
Since Android and iOS are already present, are you considering plugin for cross platforms like Google Flutter ?
[[MMKV defaultMMKV] setFloat:newLocation.coordinate.latitude forKey:CCLastLatitude];
fail to mlock crc [mmkv.default]-0x10ac34000, 12:Cannot allocate memory
e.g. Objective-C, Swift, Java, or Kotlin
Kotlin
e.g. v1.0.10
v1.0.10
e.g. iOS or Android
e.g. Cocoapods, Carthage, Maven, AAR Package or Git clone
Maven
Post the outputs or screenshots for errors.
Explain what you want by example or code in English.
More than one file was found with OS independent path 'lib/x86/libc++_shared.so'
Objective-C
v1.0.10
iOS
Cocoapods
I found that all set&get methods call 'key.length' for check key vaild, but the passed key will be crash if it is an id type but not a string.
Android
Is this thread-safe?
e.g. Objective-C, Swift, Java, or Kotlin
e.g. v1.0.10
e.g. iOS or Android
e.g. Cocoapods, Carthage, Maven, AAR Package or Git clone
Post the outputs or screenshots for errors.
Explain what you want by example or code in English.
看了项目描述,初步看了下代码,有以下2点疑问点需要帮助:
Expected NDK STL shared object file at /Users/didi/Library/Android/sdk/ndk-bundle/sources/cxx-stl/llvm-libc++/libs/armeabi/libc++_shared.so
MMKV.mmkvWithID("test/hello2").encode("hello", "world")
id中使用/
会导致崩溃
onDestroy方法调用MMKV.onExit是为了清除缓存嘛?还有其它作用嘛?如果不调用有什么问题?
var kv = MMKV.defaultMMKV()
调用这行代码,卡顿,然后就闪退了,除了这个
Fatal signal 11 (SIGSEGV) at 0x00000004 (code=1), thread 17055 (com.zxy.app)
没有看到其他的任何日志。
是我使用方式错了吗。
e.g. Objective-C, Swift, Java, or Kotlin
Java
e.g. v1.0.10
v1.0.11
e.g. iOS or Android
Android
e.g. Cocoapods, Carthage, Maven, AAR Package or Git clone
AAR
Post the outputs or screenshots for errors.
Explain what you want by example or code in English.
In both the main process and the push process, the push process initialization fails
Disclaimer: This is a bot
It looks like your repo is trending. The github_trending_videos Instgram account automatically shows the demo gifs of trending repos in Github.
Your README doesn't seem to have any demo gifs. Add one and the next time the parser runs it will pick it up and post it on its Instagram feed. If you don't want to just close this issue we won't bother you again.
代替SharedPreferences
可以设置缓存时间吗?
比如我缓存时效为1小时,1小时之后拿到的value需要为空或null
Many data is corrupted every day. Any investigate on the root cause?
Java
v1.0.10
Android
Maven, AAR Package
call kv.encode("string", null) will not update the value to ""
RT
InterProcessLock.cpp
e.g. Objective-C, Swift, Java, or Kotlin
java
e.g. v1.0.10
v1.0.10
e.g. iOS or Android
Android
e.g. Cocoapods, Carthage, Maven, AAR Package or Git clone
Post the outputs or screenshots for errors.
registerOnSharedPreferenceChangeListener And unregisterOnSharedPreferenceChangeListener
not suport
Explain what you want by example or code in English.
OnSharedPreferenceChangeListener Is a very common and important API
现在在项目中临时修改了MMKV的源码,来支持macos平台,后期官方有计划支持macos平台么
目前将1111行代码,改为NSLibraryDirectory文件夹,是否有影响?
i hava set
ndk.dir=/Users/xxx/xxx/android-ndk-r10e
Android Studio 3.1
JDK 1.8
Due to NDK version is too low ???? should using NDK r16b?
Stack:
Caused by: java.lang.IllegalArgumentException: Parameter specified as non-null is null: method com.android.build.gradle.internal.cxx.configure.JsonGenerationVariantConfiguration., parameter ndkVersion
at com.android.build.gradle.internal.cxx.configure.JsonGenerationVariantConfiguration.(JsonGenerationVariantConfiguration.kt)
at com.android.build.gradle.tasks.ExternalNativeJsonGenerator.create(ExternalNativeJsonGenerator.java:636)
at com.android.build.gradle.internal.TaskManager.createExternalNativeBuildJsonGenerators(TaskManager.java:1602)
at com.android.build.gradle.internal.LibraryTaskManager.createTasksForVariantScope(LibraryTaskManager.java:178)
at com.android.build.gradle.internal.VariantManager.createTasksForVariantData(VariantManager.java:633)
at com.android.build.gradle.internal.VariantManager.lambda$createAndroidTasks$1(VariantManager.java:381)
at com.android.builder.profile.ThreadRecorder.record(ThreadRecorder.java:81)
at com.android.build.gradle.internal.VariantManager.createAndroidTasks(VariantManager.java:377)
at com.android.build.gradle.BasePlugin.lambda$createAndroidTasks$6(BasePlugin.java:800)
at com.android.builder.profile.ThreadRecorder.record(ThreadRecorder.java:81)
at com.android.build.gradle.BasePlugin.createAndroidTasks(BasePlugin.java:795)
at com.android.build.gradle.BasePlugin.lambda$null$4(BasePlugin.java:690)
at com.android.builder.profile.ThreadRecorder.record(ThreadRecorder.java:81)
at com.android.build.gradle.BasePlugin.lambda$createTasks$5(BasePlugin.java:686)
at org.gradle.configuration.internal.DefaultListenerBuildOperationDecorator$BuildOperationEmittingAction$1$1.run(DefaultListenerBuildOperationDecorator.java:155)
at org.gradle.configuration.internal.DefaultUserCodeApplicationContext.reapply(DefaultUserCodeApplicationContext.java:58)
at org.gradle.configuration.internal.DefaultListenerBuildOperationDecorator$BuildOperationEmittingAction$1.run(DefaultListenerBuildOperationDecorator.java:152)
at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:300)
at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:292)
at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:174)
at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:90)
at org.gradle.configuration.internal.DefaultListenerBuildOperationDecorator$BuildOperationEmittingAction.execute(DefaultListenerBuildOperationDecorator.java:149)
at org.gradle.internal.event.BroadcastDispatch$ActionInvocationHandler.dispatch(BroadcastDispatch.java:91)
at org.gradle.internal.event.BroadcastDispatch$ActionInvocationHandler.dispatch(BroadcastDispatch.java:80)
at org.gradle.internal.event.AbstractBroadcastDispatch.dispatch(AbstractBroadcastDispatch.java:42)
at org.gradle.internal.event.BroadcastDispatch$SingletonDispatch.dispatch(BroadcastDispatch.java:230)
at org.gradle.internal.event.BroadcastDispatch$SingletonDispatch.dispatch(BroadcastDispatch.java:149)
at org.gradle.internal.event.AbstractBroadcastDispatch.dispatch(AbstractBroadcastDispatch.java:58)
at org.gradle.internal.event.BroadcastDispatch$CompositeDispatch.dispatch(BroadcastDispatch.java:324)
at org.gradle.internal.event.BroadcastDispatch$CompositeDispatch.dispatch(BroadcastDispatch.java:234)
at org.gradle.internal.event.ListenerBroadcast.dispatch(ListenerBroadcast.java:140)
at org.gradle.internal.event.ListenerBroadcast.dispatch(ListenerBroadcast.java:37)
at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:93)
at com.sun.proxy.$Proxy33.afterEvaluate(Unknown Source)
at org.gradle.configuration.project.LifecycleProjectEvaluator$NotifyAfterEvaluate$1.execute(LifecycleProjectEvaluator.java:187)
at org.gradle.configuration.project.LifecycleProjectEvaluator$NotifyAfterEvaluate$1.execute(LifecycleProjectEvaluator.java:184)
at org.gradle.api.internal.project.DefaultProject.stepEvaluationListener(DefaultProject.java:1418)
at org.gradle.configuration.project.LifecycleProjectEvaluator$NotifyAfterEvaluate.run(LifecycleProjectEvaluator.java:193)
at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:300)
at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:292)
at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:174)
at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:90)
at org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31)
at org.gradle.configuration.project.LifecycleProjectEvaluator$EvaluateProject.run(LifecycleProjectEvaluator.java:110)
at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:300)
at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:292)
at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:174)
at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:90)
at org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31)
at org.gradle.configuration.project.LifecycleProjectEvaluator.evaluate(LifecycleProjectEvaluator.java:68)
at org.gradle.api.internal.project.DefaultProject.evaluate(DefaultProject.java:687)
at org.gradle.api.internal.project.DefaultProject.evaluate(DefaultProject.java:140)
at org.gradle.execution.TaskPathProjectEvaluator.configure(TaskPathProjectEvaluator.java:35)
at org.gradle.execution.TaskPathProjectEvaluator.configureHierarchy(TaskPathProjectEvaluator.java:62)
at org.gradle.configuration.DefaultBuildConfigurer.configure(DefaultBuildConfigurer.java:41)
at org.gradle.initialization.DefaultGradleLauncher$ConfigureBuild.run(DefaultGradleLauncher.java:274)
at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:300)
at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:292)
at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:174)
at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:90)
at org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31)
at org.gradle.initialization.DefaultGradleLauncher.configureBuild(DefaultGradleLauncher.java:182)
at org.gradle.initialization.DefaultGradleLauncher.doBuildStages(DefaultGradleLauncher.java:141)
at org.gradle.initialization.DefaultGradleLauncher.getConfiguredBuild(DefaultGradleLauncher.java:119)
at org.gradle.internal.invocation.GradleBuildController$2.call(GradleBuildController.java:86)
at org.gradle.internal.invocation.GradleBuildController$2.call(GradleBuildController.java:83)
at org.gradle.internal.work.DefaultWorkerLeaseService.withLocks(DefaultWorkerLeaseService.java:154)
at org.gradle.internal.work.StopShieldingWorkerLeaseService.withLocks(StopShieldingWorkerLeaseService.java:38)
at org.gradle.internal.invocation.GradleBuildController.doBuild(GradleBuildController.java:96)
at org.gradle.internal.invocation.GradleBuildController.configure(GradleBuildController.java:83)
at org.gradle.tooling.internal.provider.runner.ClientProvidedBuildActionRunner.run(ClientProvidedBuildActionRunner.java:70)
at org.gradle.launcher.exec.ChainingBuildActionRunner.run(ChainingBuildActionRunner.java:35)
at org.gradle.launcher.exec.ChainingBuildActionRunner.run(ChainingBuildActionRunner.java:35)
at org.gradle.tooling.internal.provider.ValidatingBuildActionRunner.run(ValidatingBuildActionRunner.java:32)
at org.gradle.launcher.exec.RunAsBuildOperationBuildActionRunner$3.run(RunAsBuildOperationBuildActionRunner.java:50)
at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:300)
at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:292)
at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:174)
at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:90)
at org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31)
at org.gradle.launcher.exec.RunAsBuildOperationBuildActionRunner.run(RunAsBuildOperationBuildActionRunner.java:45)
at org.gradle.tooling.internal.provider.SubscribableBuildActionRunner.run(SubscribableBuildActionRunner.java:51)
at org.gradle.launcher.exec.InProcessBuildActionExecuter$1.transform(InProcessBuildActionExecuter.java:47)
at org.gradle.launcher.exec.InProcessBuildActionExecuter$1.transform(InProcessBuildActionExecuter.java:44)
at org.gradle.composite.internal.DefaultRootBuildState.run(DefaultRootBuildState.java:79)
at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:44)
at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:30)
at org.gradle.launcher.exec.BuildTreeScopeBuildActionExecuter.execute(BuildTreeScopeBuildActionExecuter.java:39)
at org.gradle.launcher.exec.BuildTreeScopeBuildActionExecuter.execute(BuildTreeScopeBuildActionExecuter.java:25)
at org.gradle.tooling.internal.provider.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:80)
at org.gradle.tooling.internal.provider.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:53)
at org.gradle.tooling.internal.provider.ServicesSetupBuildActionExecuter.execute(ServicesSetupBuildActionExecuter.java:62)
at org.gradle.tooling.internal.provider.ServicesSetupBuildActionExecuter.execute(ServicesSetupBuildActionExecuter.java:34)
at org.gradle.tooling.internal.provider.GradleThreadBuildActionExecuter.execute(GradleThreadBuildActionExecuter.java:36)
at org.gradle.tooling.internal.provider.GradleThreadBuildActionExecuter.execute(GradleThreadBuildActionExecuter.java:25)
at org.gradle.tooling.internal.provider.ParallelismConfigurationBuildActionExecuter.execute(ParallelismConfigurationBuildActionExecuter.java:43)
at org.gradle.tooling.internal.provider.ParallelismConfigurationBuildActionExecuter.execute(ParallelismConfigurationBuildActionExecuter.java:29)
at org.gradle.tooling.internal.provider.StartParamsValidatingActionExecuter.execute(StartParamsValidatingActionExecuter.java:59)
at org.gradle.tooling.internal.provider.StartParamsValidatingActionExecuter.execute(StartParamsValidatingActionExecuter.java:31)
at org.gradle.tooling.internal.provider.SessionFailureReportingActionExecuter.execute(SessionFailureReportingActionExecuter.java:59)
at org.gradle.tooling.internal.provider.SessionFailureReportingActionExecuter.execute(SessionFailureReportingActionExecuter.java:44)
at org.gradle.tooling.internal.provider.SetupLoggingActionExecuter.execute(SetupLoggingActionExecuter.java:46)
at org.gradle.tooling.internal.provider.SetupLoggingActionExecuter.execute(SetupLoggingActionExecuter.java:30)
at org.gradle.launcher.daemon.server.exec.ExecuteBuild.doBuild(ExecuteBuild.java:67)
at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:122)
at org.gradle.launcher.daemon.server.exec.WatchForDisconnection.execute(WatchForDisconnection.java:37)
at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:122)
at org.gradle.launcher.daemon.server.exec.ResetDeprecationLogger.execute(ResetDeprecationLogger.java:26)
at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:122)
at org.gradle.launcher.daemon.server.exec.RequestStopIfSingleUsedDaemon.execute(RequestStopIfSingleUsedDaemon.java:34)
at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:122)
at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.call(ForwardClientInput.java:74)
at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.call(ForwardClientInput.java:72)
at org.gradle.util.Swapper.swap(Swapper.java:38)
at org.gradle.launcher.daemon.server.exec.ForwardClientInput.execute(ForwardClientInput.java:72)
at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:122)
at org.gradle.launcher.daemon.server.exec.LogAndCheckHealth.execute(LogAndCheckHealth.java:55)
at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:122)
at org.gradle.launcher.daemon.server.exec.LogToClient.doBuild(LogToClient.java:62)
at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:122)
at org.gradle.launcher.daemon.server.exec.EstablishBuildEnvironment.doBuild(EstablishBuildEnvironment.java:81)
at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:122)
at org.gradle.launcher.daemon.server.exec.StartBuildOrRespondWithBusy$1.run(StartBuildOrRespondWithBusy.java:50)
at org.gradle.launcher.daemon.server.DaemonStateCoordinator$1.run(DaemonStateCoordinator.java:295)
at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63)
at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:46)
at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:55)
- (BOOL)setObject:(id)object forKey:(NSString *)key NS_SWIFT_NAME(set(_:forKey:));
支持的类型只有 NSString/NSData/NSDate 这三种,为什么不是分成三个不同的方法而是采用通用 id 来处理呢?
- (BOOL)setString:(NSString *)string forKey:(NSString *)key NS_SWIFT_NAME(set(_:forKey:));
- (BOOL)setDate:(NSDate *)date forKey:(NSString *)key NS_SWIFT_NAME(set(_:forKey:));
- (BOOL)setData:(NSData *)data forKey:(NSString *)key NS_SWIFT_NAME(set(_:forKey:));
e.g. Objective-C, Swift, Java, or Kotlin
支持object么?
e.g. v1.0.10
e.g. iOS or Android
e.g. Cocoapods, Carthage, Maven, AAR Package or Git clone
Post the outputs or screenshots for errors.
Explain what you want by example or code in English.
Do you use mmkv in WeChat? Didn't found libmmkv.so
in lastest WeChat Apk(version 6.7.2).
Android 有混淆规则吗,还是不需要混淆
Java
v1.0.10
Android
Git clone
Post the outputs or screenshots for errors.
> Task :mmkvdemo:validateSigningDebug FAILED
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':mmkvdemo:validateSigningDebug'.
> Keystore file '/Users/lingol/AndroidStudioProjects/key1' not found for signing config 'config'.
gradle build
error, not find key1
Java
v1.0.10
Android
OOM caused by mmkv file size too large.
loading [***] with file size 134217728, oldActualSize 6788724, newActualSize 6788839
Only 1000+ key-values occupies 130M.
What's the possible reason for actualSize much less than file size, multi-process read & write in single process mode?
[!] The platform of the target TestOfMacOS
(macOS 10.13) is not compatible with MMKV (1.0.10)
, which does not support osx
.
如果macOS App是单进程模式,MMKV现在能支持吗?
+ (void)initialize {
if (self == MMKV.class) {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
g_instanceDic = [NSMutableDictionary dictionary];
g_instanceLock = [[NSRecursiveLock alloc] init];
MMKVInfo(@"pagesize:%d", DEFAULT_MMAP_SIZE);
});
}
}
Objective-C
v1.0.10
iOS
Cocoapods
For me, I often use a NSUserDefault to do some simple data persistence. And the NSDictionary is a very important one. Why is there no support for it?
After calling mmkv.putInt("int", 100)
several times, I got a file named after mmkv id under the app's data folder. By inspecting the file content with xxd
, I am a little bit confused about the layout of the file.
m_actualSize
,and we have 6700 0000
0x67 = 103 bytes.0603 696e 7401 64
06
is the size of the map03 696e 74
represents the length(03
bytes) and content of the key (696e 74
, "int"
)01 64
represents the length(01
bytes) and the content of the value (0x64
= 100)Why do we need to write size of the map into the mmaped file anyway? It seems that the size is of no use when decoding.
MMKV/Android/MMKV/mmkv/src/main/cpp/MiniPBCoder.cpp
Lines 253 to 271 in 2a3920a
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.