2012-07-26 54 views
0

我的应用程序使用相互认证连接到我的服务器,所以我有一个包含证书的.p12文件。一切工作是应该的方式,但是当我剖析仪器使用我的应用程序,它检测到这条线内存泄漏:内存泄漏与SecPKCS12Import

if([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodClientCertificate]){ 

    NSData* p12data = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"client" ofType:@"p12"]]; 

    CFArrayRef itemsCFArray = nil; 

    NSDictionary* dico = [NSDictionary dictionaryWithObjectsAndKeys:@"password",kSecImportExportPassphrase, nil]; 
    // MEMORY LEAK just below 
    OSStatus check = SecPKCS12Import((__bridge CFDataRef)p12data, (__bridge CFDictionaryRef)dico, &itemsCFArray); 

    if(check != noErr){ 
     NSLog(@"Error importing PKCS"); 
    } 

    NSArray* items = (__bridge NSArray*)itemsCFArray; 


    SecIdentityRef identityRef = (__bridge SecIdentityRef)[[items objectAtIndex:0] objectForKey:(__bridge id)kSecImportItemIdentity]; 

    NSURLCredential* credential = [NSURLCredential credentialWithIdentity:identityRef certificates:nil persistence:NSURLCredentialPersistenceNone]; 

    [challenge.sender useCredential:credential forAuthenticationChallenge:challenge]; 

} 

我试图使用CFDictionaryRef代替,但它不解决错误。

我发现有人用同样的问题,但他的解决办法是iOS4的,和我使用iOS5的(事实上,我已经在做同样的事情):http://www.ipup.fr/forum/viewtopic.php?id=2855(法语,抱歉)

如何我解决这个问题?由于这种内存泄漏,Apple会拒绝我的应用程序吗?

+0

正如我在我的帖子中所说,他使用的是ios4,我使用的是ios5。我的代码与他的解决方案类似,具有ios5特性。 – Oyashiro 2012-07-26 14:11:14

回答

0

我不认为问题是与字典,itemsCFArray似乎是泄漏。 SecPKCS12Import将CF引用传回给itemsCFArray,当您完成对象的使用时,您将需要CFRelease。

尝试在创建凭证后调用CFRelease(itemsCFArray)。