Контейнер Foundation, такой как NSArray
или NSDictionary
, сохраняет объекты, которыми он непосредственно владеет, но не подобъекты, которыми владеют объекты.
Например, если NSArray*a
содержит NSArray*b
и, в свою очередь, содержит NSArray*c
, a
сохраняет b
, а b
сохраняет c
, но a
не сохраняет c
.
Тем не менее, вы думаете с неправильной точки зрения. Это не правильно , чтобы вы удивились, например: «Должен ли я сохранить этот объект (скажем x
) перед передачей x
другому объекту y
, потому что y
может не сохранить его надлежащим образом ?» Смысл retain
/ release
заключается в том, чтобы убедиться, что объект сохраняет и освобождает принадлежащие ему объекты. Вы доверяете другим объектам делать то же самое.
Тогда все, что вам нужно сделать, если вы поместите объект x
в массив y
, это чтобы вы не выпускали x
(если он не был автоматически выпущен), когда он становится ненужным для вас . Если y
это нужно, y
сохраняет его, так что вам не нужно об этом заботиться.
Скажем, у вас уже есть существующий NSMutableArray*array
. Тогда вы бы сделали в методе что-то вроде этого:
NSMutableDictionary* dictionary=[[NSMutableDictionary alloc] init];
... do something with dictionary ...
[array addObject:dictionary];
[dictionary release];
Видите ли, массив несет ответственность за сохранение словаря, если он нужен этому массиву. Это нужно, и поэтому оно сохраняет это. Вам не нужно заботиться об этом.
Метод несет ответственность за сохранение словаря, если метод нуждается в нем, за освобождение его, если метод больше не нужен. Итак, как показано выше, метод освобождает его, как только завершает работу, добавляя его в массив.
Опять же: весь смысл retain
/ release
состоит в том, чтобы позволить вам рассматривать жизненный цикл объекта очень локально в коде.
Всякий раз, когда вы вызываете метод method:
другого объекта a
, передавая объект b
, вам не нужно беспокоиться, как вы это делаете сейчас, сохраняет ли method:
b
или нет, и вы не не нужно беспокоиться, если вам нужно сохранить b
перед передачей b
в method:
.
Это потому, что каждый метод в структуре Какао и каждый метод, который вы пишете, сохраняют объект b
, переданный ему, если метод нуждается в нем позже, и не сохраняют b
, если он не нужен потом.