我在我的 iOS 项目中使用 ARC,并且正在使用一个名为 SSKeychain 的库来访问/保存项目到钥匙串。我希望我的应用程序在峰值负载时每 10 秒左右访问一次钥匙串项目(以访问 API 安全令牌),因此我想测试这个库以查看它在频繁调用时如何处理。我做了这个循环来模拟大量的调用,并注意到它在 iPhone(不是模拟器)上运行时会消耗大量内存(~75 mb):
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
dispatch_async(dispatch_get_main_queue(), ^{
NSUInteger beginMemory = available_memory();
for (int i = 0; i < 10000; ++i) {
@autoreleasepool{
NSError * error2 = nil;
SSKeychainQuery* query2 = [[SSKeychainQuery alloc] init];
query2.service = @"Eko";
query2.account = @"loginPINForAccountID-2";
query2.password = nil;
[query2 fetch:&error2];
}
}
NSUInteger endMemory = available_memory();
NSLog(@"Started with %u, ended with %u, used %u", beginMemory, endMemory, endMemory-beginMemory);
});
return YES;
}
static NSUInteger available_memory(void) {
// Requires #import <mach/mach.h>
NSUInteger result = 0;
struct task_basic_info info;
mach_msg_type_number_t size = sizeof(info);
if (task_info(mach_task_self(), TASK_BASIC_INFO, (task_info_t)&info, &size) == KERN_SUCCESS) {
result = info.resident_size;
}
return result;
}
我正在使用可以在这里找到的 SSKeychain找到的 SSKeychain 。无论内容是否实际存储在钥匙串上,此测试都会消耗大约 75 mb 的内存。
任何想法发生了什么?我的测试方法有缺陷吗?