You're still instantiating every handler class just to see whether one applies 
to a given file.

This is exactly why class methods exist: You can implement a class method on 
your handler classes like "Can this handler class be used for files of this 
type?"  Then, for the class answers yes, that's the one you +alloc/-init to 
actually keep around as the handler for a specific file.

  -- Chris


On Dec 18, 2011, at 3:42 PM, C.W. Betts wrote:

> Thanks for the input everyone.
> 
> For those curious, this is the final code:
> - (BOOL)application:(NSApplication *)theApplication openFile:(NSString 
> *)filename
> {
>       NSError *err = nil;
>       NSString *utiFile = [[NSWorkspace sharedWorkspace] typeOfFile:filename 
> error:&err];
>       if (err) {
>               NSRunAlertPanel(NSLocalizedString(@"Error opening file",nil), 
> [NSString stringWithFormat:NSLocalizedString(@"Unable to open %@: %@", nil), 
> [filename lastPathComponent], [err localizedFailureReason]], nil, nil, nil);
>               return NO;
>       }
>       NSArray *handlers = [NSArray arrayWithObjects:[PcsxrPluginHandler 
> class], [PcsxrMemCardHandler class], [PcsxrFreezeStateHandler class], 
> [PcsxrDiscHandler class], nil];
>       BOOL isHandled = NO;
>       for (Class fileHandler in handlers) {
>               NSObject<PcsxrFileHandle> *hand = [[fileHandler alloc] init];
>               BOOL canHandle = NO;
>               for (NSString *uti in [fileHandler supportedUTIs]) {
>                       if ([[NSWorkspace sharedWorkspace] type:utiFile  
> conformsToType:uti]) {
>                               canHandle = YES;
>                       }
>               }                       
>               if (canHandle) {
>                       isHandled = [hand handleFile:HandleBinCue(filename)];
>               }
>               [hand release];
> 
>       }
>       return isHandled;
> }
> 
> 
> On Dec 18, 2011, at 12:22 PM, Charles Srstka wrote:
> 
>> You can just send the alloc/init message directly to the class object.
>> 
>> Charles
>> 
>> On Dec 18, 2011, at 11:01 AM, C.W. Betts wrote:
>> 
>>> Let me see if I got this right. Create an NSArray with classes like this:
>>> [NSArray arrayWithObjects:[ClassName1 class], [ClassName2 class], nil]
>>> Then how would I call it? Would [[[anArray objectAtIndex:i] alloc] init] 
>>> work? Or would I have to use a pure C method, something along the lines of 
>>> getIdFromClass()?
>>> On Dec 18, 2011, at 2:20 AM, Charles Srstka wrote:
>>> 
>>>> On Dec 18, 2011, at 3:14 AM, Ken Thomases wrote:
>>>> 
>>>>> On Dec 18, 2011, at 3:06 AM, Charles Srstka wrote:
>>>>> 
>>>>>> On Dec 18, 2011, at 2:49 AM, Ken Thomases wrote:
>>>>>> 
>>>>>>> On Dec 18, 2011, at 2:36 AM, Charles Srstka wrote:
>>>>>>> 
>>>>>>>> On Dec 18, 2011, at 2:31 AM, C.W. Betts wrote:
>>>>>>>> 
>>>>>>>>> So I would do something along the lines of [NSArray 
>>>>>>>>> arrayWithObjects:ClassName1, ClassName2, nil]?
>>>>>>>> 
>>>>>>>> Or just class1, class2, etc. where class1 and class2 are both of type 
>>>>>>>> Class.
>>>>>>> 
>>>>>>> You can use pointers to class objects, but you can't just use class 
>>>>>>> names.  If you are starting from class names, you use [ClassName1 
>>>>>>> class] to get the class object.
>>>>>> 
>>>>>> Well, you *could* just use class names, if you used NSClassFromString() 
>>>>>> before using the class. There wouldn’t be much point in doing that, 
>>>>>> though, since class objects can fit inside arrays and would be more 
>>>>>> convenient to use here.
>>>>> 
>>>>> Did you mean for this to be off-list?  Anyway, I took his use of 
>>>>> ClassName1 to mean an identifier.  After all, he didn't write 
>>>>> @"ClassName1”.
>>>> 
>>>> Nope, sorry, that was meant to be on-list. You’re probably right — I had 
>>>> assumed that those were meant to be NSString variables, since that’s what 
>>>> you’d need to be using if you were storing class names. Wasn’t thinking 
>>>> from an Obj-C newbie perspective there; sorry. At any rate, getting the 
>>>> class object by calling +class is, of course, the correct thing to do.
>>>> 
>>>> Charles
>>>> 
>>>> _______________________________________________
>>>> 
>>>> 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/computers57%40hotmail.com
>>>> 
>>>> This email sent to computer...@hotmail.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/cmh%40me.com
> 
> This email sent to c...@me.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

Reply via email to