I recently saw some example code in a WWDC video from an Apple engineer. He was using `NSArray`'s `enumerateObjectsUsingBlock:` method, but I noticed the first argument to the block was not `id` as I'm used to, but had been changed to the concrete type that the developer knew was in the array.

For example, I just gave this a go in Xcode and everything works correctly:

```
NSArray *test = [NSArray arrayWithObjects:@"one", @"two", @"three", nil];
[test enumerateObjectsUsingBlock:^(NSString *aString, NSUInteger idx, BOOL *stop) {
    // ...
}];

```

The declaration for `enumerateObjectsUsingBlock:` declares the first block argument to be of type `id`:

```
- (void)enumerateObjectsUsingBlock:(void (^)(id obj, NSUInteger idx, BOOL *stop))block

```

Now I understand that `id` can be used to represent any objective-c type, but this little trick with arguments was unknown to me.

Is there any documentation for this feature of the language? Can this be used in regular methods where you have an `(id)sender` argument too? Is this even safe or fully supported?