This is a bug in the framework. NSError-returning methods should not need to check the value of the dereferenced pointer before setting it.
Please file a bug for this. -KP On Mar 8, 2011, at 7:22 AM, Gerriet M. Denkmann wrote: > I thought that NSError is just an output parameter, which is set only in case > of errors. > > But in my completion handler block (see below) NSError MUST be initialized to > nil, or it will NOT be set. > > The same code works as expected when NOT inside a block. > > > #define REMOVE_BUG // if this is NOT defined, we get: > > [...] __-[Alias_TestAppDelegate openAliasFile:]_block_invoke_1 outError1 > 0x10057f3b0 (NOT initialized) > [...] __-[Alias_TestAppDelegate openAliasFile:]_block_invoke_1 outError2 > 0x10057f3b0 (after error return) > [...] -[NSOpenPanel recoveryAttempter]: unrecognized selector sent to > instance 0x10057f3b0 > > > Here is the code: > > - (IBAction)openAliasFile: sender; > { > (void)sender; > > NSOpenPanel *openPanel = [ NSOpenPanel openPanel ]; > [ openPanel setAllowsMultipleSelection: NO ]; > [ openPanel setCanChooseDirectories: NO ]; > [ openPanel setResolvesAliases: NO ]; > [ openPanel setMessage: @"Select Alias File" ]; > > [ openPanel beginSheetModalForWindow: self.window > completionHandler: > ^(NSInteger result) > { > if (result == NSOKButton) > { > NSURL *bookmarkFileURL = [ > openPanel URL ]; > > [ [ self window ] > setTitleWithRepresentedFilename: [ bookmarkFileURL path ] ]; > > [ openPanel orderOut:self]; // close panel > before we might present an error > > // if <bookmarkFileURL> is > NOT an alias file, <bookmarkData> will be nil, but <outError> > // is NOT set. Works > correctly if we initialise <outError> to nil. > > #ifdef REMOVE_BUG > NSError *outError = nil; > #else > NSError *outError; > NSLog(@"%s outError1 %p (NOT > initialized)",__FUNCTION__, outError); > #endif > > NSData *bookmarkData = [ NSURL > bookmarkDataWithContentsOfURL: bookmarkFileURL > > error: > &outError > > ]; > if ( bookmarkData == nil ) > // error > { > NSLog(@"%s outError2 %p > (after error return)",__FUNCTION__, outError); > > [ self presentError: > outError > > modalForWindow: [ self window ] > > delegate: nil > > didPresentSelector: NULL > > contextInfo: NULL > ]; > > return; > }; > > > // do something with valid > bookmarkData > > } > else // cancelled > { > self.dataString = @"-- > Cancelled --"; > }; > } > ]; > } > > > Kind regards, > > Gerriet. > > P.S. Tested on 10.6.6 > > _______________________________________________ > > 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/kperry%40apple.com > > This email sent to kpe...@apple.com _______________________________________________ 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