2017-02-14 26 views
1

У меня есть приложение, которое проверяет подписи кода. Я использую SecStaticCodeCheckValidity, чтобы проверить, действительна ли подпись. Прежде чем я вызову метод, у меня относительно небольшой объем памяти, но после завершения метода мой объем памяти почти удваивается, и я не знаю, где именно это происходит.Почему метод «SecStaticCodeCheckValidity» сверяет мою память?

OSStatus errorCode=SecStaticCodeCheckValidity(_codeReference, kSecCSConsiderExpiration,NULL); 
    CFRelease(_codeReference); 
    switch(errorCode) 
    { 
      case errSecInvalidRoot:validity=INVALID; 
       break; 
      case errSecCRLNotValidYet:validity=NOT_VALID_YET; 
       break; 
      case errSecCertificateRevoked:validity=REVOKED; 
       break; 
      case errSecCertificateExpired:validity=EXPIRED; 
       break; 
      case errSecSuccess:_signatureValidity=VALID; 
       break; 
      default: validity=BROKEN; 
       break; 
    } 

Теперь, что именно я должен выпустить, когда я уже выпустил «_codeReference»?

UPDATE:

#import <Foundation/Foundation.h> 
#import <Security/Security.h> 
int main(int argc, const char * argv[]) { 
    SecStaticCodeRef codeRef; 
    CFURLRef appURL=CFURLCreateWithFileSystemPath(kCFAllocatorDefault, CFSTR("/Applications/Xcode.app"), kCFURLPOSIXPathStyle, YES); 
    SecStaticCodeCreateWithPath(appURL, kSecCSDefaultFlags, &codeRef); 
    CFRelease(appURL); 
    CFDictionaryRef signDic; 
    SecCodeCopySigningInformation(codeRef, kSecCSSigningInformation, &signDic); 
    if(!CFDictionaryContainsKey(signDic,kSecCodeInfoIdentifier)) 
    { 
     NSLog(@"Bundle not signed...."); 
     return 0; 
    } 
    CFRelease(signDic); 
    //Verify signature 
    OSStatus code=SecStaticCodeCheckValidity(codeRef, kSecCSConsiderExpiration, NULL); 
    CFRelease(codeRef); 
    NSString*output; 
    switch(code) 
    { 
     case errSecInvalidRoot:[email protected]"INVALID"; 
      break; 
     case errSecCRLNotValidYet:[email protected]"NOT_VALID_YET"; 
      break; 
     case errSecCertificateRevoked:[email protected]"REVOKED"; 
      break; 
     case errSecCertificateExpired:[email protected]"EXPIRED"; 
      break; 
     case errSecSuccess:[email protected]"VALID"; 
      break; 
     default: [email protected]"BROKEN"; 
      break; 
    } 
    NSLog(@"%@",output); 
    return 0; 
} 

Я обновил свой SampleApplication и контролировать приложение в инструменты. enter image description here Это означает, что я не правильно освобождаю память в своем коде.

+1

Откуда вы знаете, что это действительно утечка? –

+0

Я отслеживаю память с помощью Activity Monitor и Xcode. В Xcode я использую график памяти для отладки. Я просто подумал, что я могу выполнить проверку над оболочкой с помощью кода, но, к сожалению, у кодов, похоже, такая же проблема. – ok404

+1

'codeign' не работает постоянно; он запускается, а затем завершается. В вашем коде нет ничего, хотя это должно протекать. Если у вас есть отладочные журналы поведения, я рекомендую вам опубликовать их с вашим вопросом. –

ответ

0

После того, как я переписал свой код для использования ARC, все проблемы с памятью исчезли. Так что на самом деле я виноват, что объекты были неправильно выпущены.