iphone - будет ли свойство retain распространяться в массиве? - PullRequest
0 голосов
/ 21 июня 2010

У меня есть изменяемый массив, который был сохранен.

Этот массив содержит словари с большим количеством ключей.Каждый словарь содержит объекты.

Нужно ли сохранять словари перед их добавлением в изменяемый массив, или сам массив сохранит все, что к нему добавлено (поскольку оно уже сохранено), включая вложенные объектыего объекты в иерархии?

спасибо.

Ответы [ 2 ]

3 голосов
/ 21 июня 2010

Контейнер 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, если он не нужен потом.

1 голос
/ 21 июня 2010

Контейнеры Objective-C (такие как NSMutableArray ) сохранят добавленные к ним объекты.

Это, однако, не имеет ничего общего с тем, что что-то «распространяется» - независимо от того, вызываете ли вы -retain для NSMutableArray, не имеет значения. NSMutableArray будет просто сохранять объекты, добавленные к нему, и если эти объекты сами являются чем-то вроде контейнера (например, словарь), то подобъекты сами уже сохранили что-либо добавленное к ним и т. Д.

пс. на самом деле нет «сохраняемого свойства», есть (внутренний) «сохраняемый счет» для каждого объекта. Например, если вы создадите строку NSString и добавите ее в 3 NSMutableArray, каждый из этих массивов будет retain it.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...