最近、巨大なライブラリを ARC に移行しましたが、ツールのないセクションが頭を悩ませています。コードは次のとおりです。
+ (NSString *)getKeychainItem:(NSString *)identifier
{
NSString *fullIdentifier = [NSString stringWithFormat:@"%@%@", kIdentifierPrefix, identifier];
NSMutableDictionary *queryKeychain;
OSStatus status = noErr;
queryKeychain = [NSMutableDictionary dictionary];
// Set the public key query dictionary.
[queryKeychain setObject:(__bridge id)kSecClassGenericPassword
forKey:(__bridge id)kSecClass];
// Get the key.
CFDataRef data;
CFDictionaryRef queryKeychainCF = (__bridge CFDictionaryRef)queryKeychain;
status = SecItemCopyMatching(queryKeychainCF, (CFTypeRef *)&data);
NSData *passwordData = (__bridge_transfer NSData *)data;
NSString *password;
if (status == noErr)
{
password = [[NSString alloc] initWithBytes:[passwordData bytes]
length:[passwordData length]
encoding:NSUTF8StringEncoding];
}
else if (status != errSecItemNotFound)
{
NSLog(@"Error getting keychain item %@ -- OSStatus: %lu", identifier, status);
}
return password;
}
これは非常に簡単なはずですが、passwordData オブジェクトがオーバーリリースされており、その理由がわかりません。スタック トレースはthisです。に設定passwordData
しnil
て実行しないと、__bridge__transfer
クラッシュしません。理由について何か考えはありますか?
どうもありがとう!