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

Reply via email to