I need to read several dozen files and do some trivial processing with their contents. Each file individually won’t cause problems, but having all the data loaded at once will quickly exhaust my memory.
I started with:
for (NSString *filename in filenames)
do_something([NSData dataWithContentsOfFile:filename]);
Then of course, I remembered that Objective-C on the iPhone is not really garbage collected, and those would all stick around until the end of the frame anyway. Okay:
for (NSString *filename in filenames) {
NSData *d = [[NSData alloc] initWithContentsOfFile:filename];
do_something(d);
[d release];
}
This nominally only uses as much memory as the largest file, but that’s only assuming the allocator is playing friendly at the moment – it could also thrash and fragment everything.
Is there some way I can make an NSMutableData, and keep reusing that Data’s buffer, growing it as necessary? I need it as an NSData for other third-party APIs. The best idea I have at the moment is mallocing/reallocing a char* buffer as I go, reading using e.g. stdio, and constructing NSDatas with freeWhenDone:NO backed by that; that way I only thrash/retain a small amount per file.
What you are doing is the second example is fine. Even if you reused an
NSMutableDataobject for its capacity anotherNSDataobject would need to be created with the file contents. If you are running into memory issues consider modifyingdo_something()to work withNSInputStreams.