पर आरएनसीप्रिप्टर के साथ बड़ी फ़ाइल को एन्क्रिप्ट/डिक्रिप्ट करते समय मेमोरी समस्याएं IOS पर बड़ी फ़ाइलों (600 + एमबी) को एन्क्रिप्ट और डिक्रिप्ट करने के लिए आरएनसीप्रिप्टर का उपयोग करने का प्रयास कर रहा हूं। the github पर मुझे स्ट्रीम पर असीमित रूप से लाइब्रेरी का उपयोग करने के तरीके पर उदाहरण कोड मिला। यह कोड a question about this same subject पर रोब नेपियर के उत्तर के समान है।आईओएस
हालांकि, हालांकि मुझे लगता है कि मैं कोड सही ढंग से लागू, एप्लिकेशन को स्मृति के 1.5 जीबी तक (आईपैड 6.1 सिम्युलेटर में) का उपयोग करता है। मैंने सोचा था कि कोड को ऐप को स्मृति में डेटा के एक से अधिक ब्लॉक रखने से रोकने के लिए माना जाता था? तो क्या गलत हो रहा है?
मेरी नियंत्रक में, मैं एक 'CryptController' जो एन्क्रिप्ट साथ मैं संदेश/डिक्रिप्ट अनुरोध पैदा करते हैं।
// Controller.m
NSString *password = @"pw123";
self.cryptor = [[CryptController alloc] initWithPassword:password];
//start encrypting file
[self.cryptor streamEncryptRequest:self.fileName andExtension:@"pdf" withURL:[self samplesURL]];
//wait for encryption to finish
NSDate *timeout = [NSDate dateWithTimeIntervalSinceNow:1];
do {
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode
beforeDate:timeout];
} while (![self.cryptor isFinished]);
CryptController में मेरे पास है:
- (void)streamEncryptionDidFinish {
if (self.cryptor.error) {
NSLog(@"An error occurred. You cannot trust decryptedData at this point");
}
else {
NSLog(@"%@ is complete. Use it as you like", [self.tempURL lastPathComponent]);
}
self.cryptor = nil;
self.isFinished = YES;
}
- (void) streamEncryptRequest:(NSString *)fileName andExtension:(NSString *)ext withURL:(NSURL *)directory {
//Make sure that this number is larger than the header + 1 block.
int blockSize = 32 * 1024;
NSString *encryptedFileName = [NSString stringWithFormat:@"streamEnc_%@", fileName];
self.tempURL = [[NSFileManager defaultManager] URLForDirectory:NSDocumentDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:NO error:nil];
self.tempURL = [self.tempURL URLByAppendingPathComponent:encryptedFileName isDirectory:NO];
self.tempURL = [self.tempURL URLByAppendingPathExtension:@"crypt"];
NSInputStream *decryptedStream = [NSInputStream inputStreamWithURL:[[directory URLByAppendingPathComponent:fileName isDirectory:NO] URLByAppendingPathExtension:ext]];
NSOutputStream *cryptedStream = [NSOutputStream outputStreamWithURL:self.tempURL append:NO];
[cryptedStream open];
[decryptedStream open];
__block NSMutableData *data = [NSMutableData dataWithLength:blockSize];
__block RNEncryptor *encryptor = nil;
dispatch_block_t readStreamBlock = ^{
[data setLength:blockSize];
NSInteger bytesRead = [decryptedStream read:[data mutableBytes] maxLength:blockSize];
if (bytesRead < 0) {
//Throw an error
}
else if (bytesRead == 0) {
[encryptor finish];
}
else {
[data setLength:bytesRead];
[encryptor addData:data];
//NSLog(@"Sent %ld bytes to encryptor", (unsigned long)bytesRead);
}
};
encryptor = [[RNEncryptor alloc] initWithSettings:kRNCryptorAES256Settings
password:self.password
handler:^(RNCryptor *cryptor, NSData *data) {
//NSLog(@"Encryptor received %ld bytes", (unsigned long)data.length);
[cryptedStream write:data.bytes maxLength:data.length];
if (cryptor.isFinished) {
[decryptedStream close];
//call my delegate that i'm finished with decrypting
[self streamEncryptionDidFinish];
}
else {
readStreamBlock();
}
}];
// Read the first block to kick things off
self.isFinished = NO;
readStreamBlock();
}
जब मैं आबंटन साधन का उपयोग कर प्रोफ़ाइल, आवंटन श्रेणियों मैं लगातार बढ़ रही है देखें malloc 32.50 KB
, malloc 4.00 KB
, NSConcreteData
और NSSubrangeData
हैं। विशेष रूप से malloc 32.50 KB
बड़ा, 1 जीबी से अधिक बढ़ता है। जिम्मेदार कॉलर [NSConcreteData initWithBytes:length:copy:freeWhenDone:bytesAreVM:]
NSConcreteData
के लिए जिम्मेदार कॉलर -[NSData(NSData) copyWithZone:]
है।
जब मैं लीक्स इंस्ट्रूमेंट का उपयोग कर प्रोफ़ाइल करता हूं, तो कोई रिसाव नहीं मिलता है।
मैं ऑब्जेक्टिव-सी के लिए नया हूँ, और से मैं क्या समझ में आया, नई एआरसी आवंटन और स्मृति का आवंटन रद्द करने को संभालने के लिए माना जाता है। जब किसी भी स्मृति से संबंधित हो जाता है, तो मुझे मिली सारी जानकारी यह मानती है कि आप एआरसी का उपयोग नहीं करते हैं (या यह लेखन के समय मौजूद नहीं था)। मुझे यकीन है कि एआरसी का उपयोग कर रहा हूं, क्योंकि जब मैं मैन्युअल रूप से स्मृति को हटाने की कोशिश करता हूं तो मुझे संकलन त्रुटियां मिलती हैं।
अगर कोई मेरी मदद कर सकता है, तो इसकी सराहना की जाएगी! यदि कोई और जानकारी की आवश्यकता है, तो मुझे इसे प्रदान करने में खुशी होगी :) इसके अलावा, मैं स्टैक ओवरफ्लो के लिए नया हूं, इसलिए यदि कुछ भी है तो मैंने अनदेखा किया है कि मुझे करना चाहिए था, कृपया मुझे सूचित करें!
मैं बस से पढ़ रहे हैं और नदियों के लिए लिख, बस सुनिश्चित करें कि स्मृति मुद्दा कहीं नहीं है वहाँ में करने की कोशिश की:
यहाँ कोड है। मेमोरी 1 एमबी से अधिक नहीं हुई, इसलिए समस्या कहीं एन्क्रिप्शन कोड के साथ है। – Johanneke