取得した配列に要素を追加したい場合、NSMutableArrayを使うわけですが、元のデータがNSArrayであり、そのコピーを元にして要素追加をしようとする際、以下の様なコードを書くとエラーになります。
NSArray *array = @[@"aa",@"bb",@"cc"];
NSMutablueArray *mArray = [[NSMutableArray alloc]init];
mArray = (NSMutableArray*)[array copy];
[mArray addObject:@"aa"] //ここで実行時エラーになる
正しくはこう
NSArray *array = @[@"aa",@"bb",@"cc"];
NSMutablueArray *mArray = [[NSMutableArray alloc]init];
mArray = (NSMutableArray*)[array mutablecopy];
[mArray addObject:@"aa"] //OK
前者でもビルドは通ります。キャストにより「このアドレスのオブジェクトはNSMutableArrayだよー」と言っているわけですから。
ただし、実態はNSArrayのままなので、いざメソッドを呼びだそうとした時にはエラーとなるわけです。
mutablecopyとすることで、NSMutableArrayのオブジェクトになるということです。