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 ([email protected])
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 [email protected]