2015-02-17 3 views
1

Мое приложение иногда считывает данные, использует его, а затем, возможно, потребуется прочитать его позже. Я заметил, что если я прочитаю данные, когда он будет выпущен, но если я снова его прочитаю, он никогда не будет выпущен.Objective-C, NSMutableData не выпущен

Почему данные не отпущены, если они читаются снова?

Код:

#import "AppDelegate.h" 

@implementation AppDelegate 

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification 
{ 
    [self readData]; // read one 
    NSLog(@"read1"); 
    sleep(1); 
    [self readData2]; 
} 

- (void)readData2 { 
    [self readData]; // read two 
    NSLog(@"read2"); 
} 

- (void)readData { 
    __block NSMutableData *data = [NSMutableData dataWithContentsOfFile:@"test"]; // file is 125 MB 
    NSUInteger size = [data length]; 
     for (NSUInteger i = 0; i < size; i++) { 
      // do stuff 
     } 
     return; 
} 
@end 

enter image description here

+1

Я видел, как это утверждал, что 'dataWIthContentsOfFile' эффективно создает«буквальным»со значением файла данных, и сохраняется, так же как строковые литералы и малых NSNumber. Я не уверен, насколько я этому верю. –

+0

Есть ли причина использования типа хранения '__block' в этом случае? Как он себя ведет, если вы это измените? – Nick

+0

@HotLicks, Spot on, и я верю в это. Я не уверен, что это буквальный, но значение определенно сохраняется с помощью 'dataWIthContentsOfFile' без' options'. –

ответ

1

Попробуйте использовать dataWithContentsOfFile:options:error с опцией:

NSDataReadingMappedIfSafe

A hint indicating the file should be mapped into virtual memory, if possible and safe.

Al хотя описание dataWithContentsOfFile не указывает, что использование options, скорее всего, приведет к сохранению данных в противном случае.

dataWithContentsOfFile

This method is equivalent to dataWithContentsOfFile:options:error: with no options. If you need to know what was the reason for failure, use dataWithContentsOfFile:options:error:.

+0

Я бы никогда не узнал, спасибо. –