Le 23 juin 2010 à 12:47, Ben Haller a écrit : > On 23-Jun-10, at 6:22 AM, Uli Kusterer wrote: > >> Am Jun 23, 2010 um 12:14 PM schrieb Ben Haller: >>> So I have a workaround for the problem, but I want to understand *why* it >>> works. Shouldn't NSPipe close its associated files when it deallocs? Why >>> should it be necessary to call -closeFile? This behavior seems to be >>> specifically contradicted by the documentation on NSPipe, which says (in >>> -fileHandleForReading) "The descriptor represented by this object is >>> deleted, and the object itself is automatically deallocated when the >>> receiver is deallocated." Well, when my NSPipes are deallocated, the file >>> handles are indeed automatically deallocated (a funny way to put it), but >>> the descriptor is *not* deleted. Is this a bug? More likely I'm >>> misunderstanding something; can anybody clarify this for me? >> >> AFAIR, NSPipe autoreleases its NSFileHandles), which means even if you give >> up all your references to the pipe, it won't automatically close everything >> until the current autorelease pool gets popped. While closeFile doesn't get >> rid of the objects, it forces the file handle to be closed, which is why it >> solves your immediate problem. >> >> If you're running your own loop where you create and tear down lots of >> pipes, it might help to just create your own autorelease pool inside the >> loop on each iteration. > > Yes; this is not an autorelease pool problem, however, as I described in my > original post. The run loop is running freely, and the pipes and file > handles are in fact getting dealloced; I have confirmed this explicitly in > Instruments. And yet, the file descriptors don't get deleted unless I > explicitly call -closeFile. That's the mystery (or is it a bug?). >
I just ran the following simple program in Instrument with "File Activity" probe, and I get exactly the expected result: Opened file descriptors raise up to ~1000 (2 by pipes), and fall to ~0 in each drain call. #import <Foundation/Foundation.h> int main (int argc, const char * argv[]) { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; for (NSUInteger idx = 0; idx < 10000; idx++) { NSPipe *pipe = [NSPipe pipe]; [pipe fileHandleForReading]; if (0 == (idx % 500)) { [pool drain]; pool = [[NSAutoreleasePool alloc] init]; } } [pool drain]; return 0; } -- Jean-Daniel _______________________________________________ Cocoa-dev mailing list (Cocoa-dev@lists.apple.com) Please do not post admin requests or moderator comments to the list. Contact the moderators at cocoa-dev-admins(at)lists.apple.com Help/Unsubscribe/Update your Subscription: http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com This email sent to arch...@mail-archive.com