Я изучал это сам и не могу найти сильное различие между двумя. Я думаю, что большой выбор находится, в которой реализации Вы используете. Для меня я рассматривал платформа DataNucleus , поскольку это - реализация агностика хранилища данных обоих.
Как упоминал @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];
Я полагаю, выбирайте то, что вам нравится, исходя из краткости: -).
Нет, Какао не открывается источник.
Если у вас есть вопрос, просто задайте его.
Это был бы один допустимый способ реализации:
+ (id)arrayWithArray:(NSArray *)array {
return [[[self alloc] initWithArray:array] autorelease];
}
Вы можете прочитать исходный код GNUStep для NSArray , но имейте в виду, что это альтернативная реализация API-интерфейсов Какао.
Если вы спрашиваете, какова цель + arrayWithArray
(помимо того, что он является оболочкой автоматического выпуска вокруг -initWithArray
), я бы сказал, что это : Используйте его, когда хотите создать автоматически выпущенную копию массива. Другими словами, вы могли бы увидеть это так:
NSArray * original = /* ... */;
NSArray * newArray = [NSArray arrayWithArray:original];
Эквивалент:
NSArray * original = /* ... */;
NSArray * newArray = [[original copy] autorelease];
Я бы сказал, что он существует для удобства использования, когда он соответствует вашему стилю.
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