Недавно я перенес огромную библиотеку в ARC, а раздел без инструментов дал головную боль. Вот код:Tall-Bridge overrelease
+ (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 объект быть overreleased, и я понятия не имею, почему, трассировки стека является this. Если я просто установил passwordData
в nil
и не делал __bridge__transfer
, это не сбой. Любая идея о том, почему?
Большое спасибо!
Боюсь, что 'CFBridgingRelease' также не работает: http://i.imgur.com/8Wi4gB7.png.Я начинаю думать, что 'SecItemCopyMatching' запахи ... –
Попробуйте сделать обычный' __bridge' и поместите NSLog (@ "% d", CFGetRetainCount (данные)) в разных местах. NSString может предполагать право собственности на память. – Luke
Спасибо luke, но проблема была другая, связанная с поведением SecItemCopyMatching –