Во-первых, эти два примера делают немного разные вещи.Один - извлечение чего-либо из существующего словаря, а другой - создание нового массива путем извлечения чего-либо из существующего словаря (значение этого ключа - массив).
Но, если вы спрашиваете разницу между получениемОбъекты по методам alloc или удобство.([NSString alloc] init vs [NSString stringWith ...), по соглашению, вам принадлежит все, что вы вызываете alloc, new copy или mutableCopy.Все, что вы называете, но не те, автоматически выпущено.
См. Руководство по памяти здесь .В частности, обратите внимание на правила .
. Получение автоматически выпущенного объекта означает, что он исчезнет в какой-то момент в ближайшем будущем.Если вам не нужно держаться за пределами области действия этой функции, то вы можете вызвать для нее автоматический выпуск или использовать один из вспомогательных методов, который не является выделением, и т. Д ...
Например:
// my object doesn't need that formatted string - create the autoreleased version of it.
- (NSString) description {
return [NSString stringWithFormat:@"%@ : %d", _title, _id];
}
// my object stuffed it away in an iVar - I need the retained version of it. release in dealloc
- (void) prepare {
_myVal = [[NSString alloc] initWithFormat:"string I need for %d", _id];
}
В первом примере я создал вспомогательные методы для вызова другими, моему классу не нужен этот объект за рамками этого метода, поэтому я создаю его автоматически выпущенную версию и возвращаю.Если вызывающий объект нуждается в этом за пределами его вызывающего метода, он может сохранить его.Если нет, он может использовать это и отпустить.Очень маленький код.
Во втором примере я форматирую строку и присваиваю ее переменной iVar, которую мне нужно удерживать на протяжении жизни моего класса, поэтому я вызываю alloc, которая сохранит ее.Я владею им и выпускаю его в конце концов.Теперь я мог бы использовать первую версию здесь и просто вызвать на ней также retain.