泄漏工具显示泄漏的NSCFData对象的数量,并且堆栈跟踪显然在我的应用程序方法的边界末尾包含以下方法。

NSData* SAKeychainGetValue(NSString *key)
{
    NSMutableDictionary *searchDictionary = SAGetKeychainSearchDictionary(key);
    [searchDictionary setObject:(__bridge id)kSecMatchLimitOne forKey:(__bridge id)kSecMatchLimit];
    [searchDictionary setObject:(id)kCFBooleanTrue forKey:(__bridge id)kSecReturnData];

    CFDataRef value = nil;
    OSStatus status = SecItemCopyMatching((__bridge CFDictionaryRef)searchDictionary, (CFTypeRef *)&value);
    if (status != errSecSuccess && status != errSecItemNotFound)
    {
        NSLog(@"failed to get key %@ with error %ld.", key, (long)status);
    }
    return (__bridge NSData*)value;
}

但是我看不到这种泄漏方法有什么问题。

最佳答案

您应该在__bridge_transfer中使用__bridge而不是(__bridge NSData*)value

应该释放SecItemCopyMatching方法的值返回(复制意味着应该以苹果命名约定释放值返回),因此您应该将所有权转移到ARC。

07-28 12:13