Я участвую в процессе обучения объективному c и программированию приложения iPad. Одна вещь, которую я продолжаю отключать, и перечитывать - это управление памятью. Я добираюсь туда ... медленно. Основные правила, например, для каждого alloc
/retain
, должны быть полезны release
. Тем не менее, одна относительно простая вещь ускользает от меня, и мне интересно, если кто-то может объяснить ...Понимание управления памятью в ios
Возьмет следующий код ...
NSArray *myArray = [[NSArray alloc] init];
myArray = [someNSSet allObjects];
Это относительно прямое кодированием и потребует [myArray release]
заявления.
Однако я продолжаю видеть примеры (и в самом деле, я использовал широко следующий «кратчайшие» ...
NSArray *myArray = (NSArray *)[someNSSet allObjects];
Как, насколько я понимаю, когда вы используете (NSString *)
вам не нужен использовать [myArray release]
заявление, но я не понимаю, почему.
Может кто-то можно объяснить?
Почему я не владею возвращенным значением. Кто/что делает? –
@BenThompson: Когда вы создаете объект (new или alloc, copy или mutableCopy), он имеет значение удержания 1 и вы его обладаете. Когда вы отправляете объекту сообщение сохранения, его количество удержания увеличивается на 1, и вы тоже владеете им. Вам нужно только освободить объекты, которыми вы владеете. –
@Ben: Скорее всего, пул авторасчетов является владельцем объекта, возвращаемого из 'allObjects'. Другая возможность - это заданный объект, но это действительно произойдет только в том случае, если набор просто выставляет объект, который уже принадлежит, вместо создания нового массива. Однако, за исключением понимания того, что происходит на заднем плане, вы не должны беспокоиться о том, кто владеет вещами. Либо вы это делаете, либо нет, и это все, что вам нужно учитывать. –