泄漏工具显示泄漏的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。