<p>I have an <code>NSArray</code> and I'd like to create a new <code>NSArray</code> with objects from the original array that meet certain criteria. The criteria is decided by a function that returns a <code>BOOL</code>.</p>

<p>I can create an <code>NSMutableArray</code>, iterate through the source array and copy over the objects that the filter function accepts and then create an immutable version of it.</p>

<p>Is there a better way?</p>

```
NSArray
```
and
```
NSMutableArray
```
provide methods to filter array contents.
```
NSArray
```
provides
filteredArrayUsingPredicate:
which returns a new array containing objects in the receiver that match the specified predicate.
```
NSMutableArray
```
adds
filterUsingPredicate:
which evaluates the receiver’s content against the specified predicate and leaves only objects that match. These methods are illustrated in the following example.
```
```
NSMutableArray *array =
    [NSMutableArray arrayWithObjects:@"Bill", @"Ben", @"Chris", @"Melissa", nil];

NSPredicate *bPredicate =
    [NSPredicate predicateWithFormat:@"SELF beginswith[c] 'b'"];
NSArray *beginWithB =
    [array filteredArrayUsingPredicate:bPredicate];
// beginWithB contains { @"Bill", @"Ben" }.

NSPredicate *sPredicate =
    [NSPredicate predicateWithFormat:@"SELF contains[c] 's'"];
[array filteredArrayUsingPredicate:sPredicate];
// array now contains { @"Chris", @"Melissa" }
```
```