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