вернуть копию или изменяемый объект - PullRequest
3 голосов
/ 16 января 2010

Какой вариант правильнее?

//first variant
    - (NSArray*) someArray
    {
     NSMutableArray* mutArr = [[NSMutableArray alloc] init];

     //...some operations with mutArr


     NSArray* retArray = [mutArr copy];

     [mutArr release]; //remove mutArr

     return [retArray autorelease];
    }

//second variant
    - (NSArray*) someArray
    {
     NSMutableArray* mutArr = [[NSMutableArray alloc] init];

     //...some operations with mutArr 

     return (NSArray*)[mutArr autorelease];
    }

Ответы [ 3 ]

6 голосов
/ 16 января 2010

Ответ: какая проблема будет, если массив будет изменен после того, как вы его вернете?

Если вы создаете изменяемый массив внутри вашего метода, а затем возвращаете его, никогда больше не будете его использовать, я думаю, что это нормально - возвращать изменяемую версию. Тот факт, что ваш метод объявляет возвращаемый тип NSArray, означает только то, что вы не будете гарантировать, что массив будет изменчивым. Вам не нужно гарантировать, что он неизменен.

С другой стороны, если вы возвращаете массив, который ваш класс использует внутри, гораздо безопаснее вернуть неизменяемую копию. В приведенном выше примере это не так.

Потребитель массива, если он хочет сохранить ссылку, должен использовать copy вместо retain; если массив изменчив, они получат неизменную копию. Если он уже неизменен, будет увеличен только счетчик ссылок. Так что штраф за копирование неизменяемого объекта отсутствует.

Другими словами, ваш второй вариант в порядке. (Хотя приведение к (NSArray *) совершенно не нужно.)

1 голос
/ 16 января 2010

Я предполагаю, что вы подразумеваете, что mutArr и names - это один и тот же массив. Если это так, то первое является более правильным, поскольку вам не нужно делать его копию.

Вы можете просто вернуть mutArray, если хотите; поскольку NSMutableArray является подклассом NSArray, возвращение одного будет работать. Если вы хотите вернуть обычный, не изменяемый NSArray, я бы порекомендовал следующее:

(NSArray*)someArray {
    NSMutableArray* mutArr = [[[NSMutableArray alloc] init ] autorelease];
    // your operations here
    return [NSArray arrayWithArray:mutArr];
}
1 голос
/ 16 января 2010

Первый, на мой взгляд, лучше. Это гарантирует неизменность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...