iOS密钥链secItemAdd崩溃

iOS密钥链secItemAdd崩溃,ios,objective-c,keychain,Ios,Objective C,Keychain,我正在尝试使用钥匙链而不使用包装器。但是当我想读取值时,我的代码崩溃了 代码: 错误:EXC\u访问错误 我做错了什么?我想SecItemAdd可以返回新添加的项目 编辑: 从文件: 要获取添加项的数据作为CFDataRef类型的对象, 指定返回类型键kSecReturnData的值为 kCFBooleanTrue 为什么要获得EXC\u BAD\u访问,答案是因为传递到SecItemAdd的字典必须是可变的 试着这样做: CFMutableDictionaryRef attributes=CF

我正在尝试使用钥匙链而不使用包装器。但是当我想读取值时,我的代码崩溃了

代码:

错误:EXC\u访问错误

我做错了什么?我想SecItemAdd可以返回新添加的项目

编辑:

从文件:

要获取添加项的数据作为CFDataRef类型的对象, 指定返回类型键kSecReturnData的值为 kCFBooleanTrue


为什么要获得EXC\u BAD\u访问,答案是因为传递到SecItemAdd的字典必须是可变的

试着这样做:

CFMutableDictionaryRef attributes=CFDictionaryCreateMutable(NULL,size, &kCFCopyStringDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks)

CFDictionaryAddValue(属性、键[x],值[x])


“键”和“值”声明为什么?我认为这只需要在SecItemCopyMatching上完成。非常感谢。
CFDictionaryRef attributes = CFDictionaryCreate(NULL, keys, values, 5, NULL, NULL);

CFDataRef result;
OSStatus status = SecItemAdd(attributes, (CFTypeRef *)&result);
if (status == errSecSuccess) {
  if (result && CFGetTypeID(result) == CFDataGetTypeID()) { //crashes here
    NSLog(@"Data");

  }


  isSuccess = YES;
} else {
  fprintf(stderr, "Error while inserting into keychain osstatus:%ld\n", status);
}
const void *keys[] = {
    kSecClass
  , kSecAttrAccessible
  , kSecAttrService
  , kSecAttrAccount
  , kSecValueData
};

const void *values[] = {
    kSecClassGenericPassword
  , kSecAttrAccessibleWhenUnlocked
  , (__bridge CFStringRef)service
  , (__bridge CFStringRef)account
  , data //CFDataRef
};