Управление памятью объектов, возвращаемых методами (iOS / Objective-C) - PullRequest
2 голосов
/ 27 декабря 2010

Я изучаю программирование на Objective-C и iOS через потрясающий курс iTunesU, опубликованный Стэнфордом (http://www.stanford.edu/class/cs193p/cgi-bin/drupal/)

Задание 2 - создать калькулятор с переменными кнопками. Цепочка команд (например, 3 + x-y) сохраняется в NSMutableArray как «anExpression», а затем мы подкидываем случайные значения для x и y на основе NSDictionary, чтобы получить решение. Эта часть задания сбивает меня с толку:

Последние два [метода] «конвертируют» выражение anExpression в / из списка свойств:

 + (id)propertyListForExpression:(id)anExpression;
+ (id)expressionForPropertyList:(id)propertyList;

Вы помните из лекции, что список свойств - это просто любая комбинация NSArray, NSDictionary, NSString, NSNumber, и т. Д., Так зачем нам даже нужен этот метод, поскольку anExpression уже является списком свойств? (Поскольку мы создаем выражения NSMutableArrays, которые содержат только объекты NSString и NSNumber, они, действительно, уже являются списками свойств.) Ну, поскольку вызывающая сторона нашего API не знает, что выражение anExpression является списком свойств. Это внутренняя деталь реализации, которую мы выбрали, чтобы не показывать ее вызывающим.

Тем не менее, вы можете подумать, что реализация этих двух методов проста, потому что anExpression уже является списком свойств, поэтому мы можем просто вернуть аргумент обратно, верно? Ну да и нет. Управление памятью на этом немного сложнее. Мы предоставим вам возможность разобраться. Дай ему свой лучший шанс.

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

Заранее спасибо за любые ответы!

1 Ответ

4 голосов
/ 27 декабря 2010

Рассмотрим, что произойдет, если вы сделаете это:

NSArray *somePropertyList = [[NSArray alloc] initWithContentsOfFile:@"..."];
id otherPropertyList = [SomeClass propertyListForExpression:somePropertyList];
[somePropertyList release];

// 'somePropertyList' has been destroyed...
// is 'otherPropertyList' valid at this point?
[otherPropertyList writeToFile:@"..." atomically:YES];

Типичный шаблон Objective C, следовательно, имеет значение retain и autorelease, поэтому вызывающему по-прежнему не нужно управлятьпамять, но объект не будет уничтожен слишком рано:

+ (id)propertyListForExpression:(id)expr {
    // increments the retain count by 1
    // then sets it up to be decremented at some point in the future
    // (thus balancing it out, and the caller doesn't have to do anything)
    return [[expr retain] autorelease];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...