The predicate would be something like
Class ec = [Elephant class];
NSPredicate *elePred = [NSPredicate predicateWithFormat:@"class==%@", ec];
NSArray *elephants = [array filteredArrayUsingPredicate:elePred];
or
NSPredicate *elePred = [NSPredicate predicateWithFormat:@"self isKindOfClass: %@", ec];
I have found predicates to be quite, er.. shall we say "Heavy". I would probably prefer your code to this.
If you are just looking to spice up your life a little you could use blocks to add a little concurrency…
NSMutableArray *results = [NSMutableArray array];
[array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop){
if([obj isKindOfClass:[Elephant class]])
[results addObject:obj];
}];