что на самом деле ДЕЛАЕТ-arrayWithArray?

Я изучал это сам и не могу найти сильное различие между двумя. Я думаю, что большой выбор находится, в которой реализации Вы используете. Для меня я рассматривал платформа DataNucleus , поскольку это - реализация агностика хранилища данных обоих.

8
задан Chris Frederick 27 July 2011 в 20:17
поделиться

4 ответа

Как упоминал @Ken, вы не можете видеть исходный код (хотя вы можете разобрать метод через gdb).

Сам метод создает неизменяемую (не может быть изменена), автоматически выпущенную копию данного массива. Следующие примеры идентичны по поведению:

// Both resulting arrays are immutable and won't be retained
NSArray* immutableArray = [[[NSArray alloc] initWithArray:mutableArray] autorelease];
NSArray* immutableArray = [NSArray arrayWithArray:mutableArray];
NSArray* immutableArray = [[mutableArray copy] autorelease];

Я полагаю, выбирайте то, что вам нравится, исходя из краткости: -).

16
ответ дан 5 December 2019 в 08:24
поделиться

Нет, Какао не открывается источник.

Если у вас есть вопрос, просто задайте его.

Это был бы один допустимый способ реализации:

+ (id)arrayWithArray:(NSArray *)array {
    return [[[self alloc] initWithArray:array] autorelease];
}

Вы можете прочитать исходный код GNUStep для NSArray , но имейте в виду, что это альтернативная реализация API-интерфейсов Какао.

2
ответ дан 5 December 2019 в 08:24
поделиться

Если вы спрашиваете, какова цель + arrayWithArray (помимо того, что он является оболочкой автоматического выпуска вокруг -initWithArray ), я бы сказал, что это : Используйте его, когда хотите создать автоматически выпущенную копию массива. Другими словами, вы могли бы увидеть это так:

NSArray * original = /* ... */;
NSArray * newArray = [NSArray arrayWithArray:original];

Эквивалент:

NSArray * original = /* ... */;
NSArray * newArray = [[original copy] autorelease];

Я бы сказал, что он существует для удобства использования, когда он соответствует вашему стилю.

2
ответ дан 5 December 2019 в 08:24
поделиться

GNUstep, реализация GNU спецификации OPENSTEP, из которой происходят Cocoa и Cocoa Touch, реализует + arrayWithArray: следующим образом:

/**
 * Returns a new autoreleased NSArray instance containing all the objects from
 * array, in the same order as the original.
 */
+ (id) arrayWithArray: (NSArray*)array
{
  id    o;

  o = [self allocWithZone: NSDefaultMallocZone()];
  o = [o initWithArray: array];
  return AUTORELEASE(o);
}

http: //svn.gna .org / viewcvs / gnustep / libs / base / trunk / Source / NSArray.m? view = markup

0
ответ дан 5 December 2019 в 08:24
поделиться