Я пытаюсь обернуть голову вокруг одной части модели памяти Objective-C (в частности, на iPhone, поэтому нет GC). Мой фон C/C++/Java, и у меня возникла проблемы с следующим фрагментом кода (также интересно, если я делаю это в «Objective-C пути» или нет):Модель памяти Objective-C
- (NSSet *) retrieve
{
NSMutableSet *set;
set = [NSMutableSet new];
// would normally fill the set in here with some data
return ([set autorelease]);
}
- (void) test
{
NSSet *setA;
NSSet *setB;
setA = [self retrieve];
setB = [[self retrieve] retain];
[setA release];
[setB release];
}
старта EDIT
Основываясь на комментарии ниже, обновленный метод извлечения:
- (NSSet *) retrieve
{
NSMutableSet *set;
set = [[[NSMutableSet alloc] initWithCapacity:100] autorelease];
// would normally fill the set in here with some data
return (set);
}
конец РЕДАКТИРОВАТЬ
Приведенный выше код дает предупреждение для [выпуска Seta] «Неправильная декремента счетчика ссылок на объективистские t на данный момент не принадлежит вызывающему ».
Я полагаю, что «новый» установил счетчик ссылок на 1. Затем «сохранить» вызов добавит 1, а вызов «release» опустит его на 1. Учитывая, что не будет установленА имеет счетчик ссылок 0 в конце и setB имеют счетчик ссылок 1 в конце?
Из того, что я выяснил методом проб и ошибок, setB верен, и утечки памяти нет, но я хотел бы понять, почему это так (что не так с моим пониманием «нового», «автореферат», «сохранить» и «освободить»).
Это совершенно не имеет отношения к делу. 'new' эквивалентно' alloc' + 'init', поэтому последствия управления памятью не сложнее. – Chuck
Возможно, вы пропустили часть вопроса, в которой содержался текст «также интересно, делаю ли я это в« Objective-C way »или нет,« Chuck. –