Вызов [objectInstance autorelease]
добавляет объект к текущему NSAutoreleasePool
. Когда этот пул получает сообщение drain
, он отправляет release
всем объектам в пуле. Если какой-либо из этих объектов retainCount достигает 0, они освобождаются в этой точке. Цель автоматического выпуска состоит в том, чтобы позволить вам пометить объект, который будет выпущен "когда-нибудь в будущем". Это особенно полезно для таких вещей, как методы, которые возвращают недавно выделенный объект, но хотят освободить его, чтобы вызывающая сторона не должна была вступать во владение возвращенным объектом. Метод может выглядеть так:
- (id)myMethod {
id myObj = [[SomeClass alloc] init];
...
return [myObj autorelease];
}
Вызывающий myMethod
затем retain
вернет возвращаемое значение, если они захотят стать владельцем возвращенного значения или проигнорируют его, если нет. Когда текущий NSAutoreleasePool
истощится, myObj
получит сообщение об освобождении. Если никакие другие объекты не владеют им (т.е. отправили ему сообщение retain
), он будет освобожден.
Все это объясняется в Какао Руководство по программированию управления памятью . Даже если вы уже прочитали его, его всегда стоит прочесть.
Итак, чтобы ответить на ваши вопросы:
Во-первых, вы должны выпустить theBackendResponse
. Вы потеряете память, если вы этого не сделаете. Вам не нужно знать, что accountDictionary
делает со строкой: если ей нужно сохранить ссылку, она сохранит theBackendResponse
. Вы владеете theBackendResponse
, потому что вы alloc
сделали это, поэтому вы должны отказаться от этого владения (через release
или косвенно через autorelease
).
Во-вторых, вы должны сохранить или скопировать аргумент в setAccountDictionary:
, если хотите сохранить ссылку на этот объект или значение соответственно. Стандартный метод установки выглядит примерно так (при условии, что вам не нужна атомарная семантика):
-(void)setAccountDictionary:(NSDictionary*)newDict {
if(newDict != accountDictionary) {
id tmp = accountDictionary;
accountDictionary = [newDict copy]; //Since newDict may be mutable, we make a copy so that accountDictionary isn't mutated behind our back.
[tmp release];
}
}
Вы также должны запомнить release
accountDictionary в методе dealloc:
- (void)dealloc {
[accountDictionary release];
[super dealloc];
}
Поскольку вы, похоже, используете NSViewController
, я предполагаю, что вы используете Leopard (OS X 10.5), и в этом случае вам, вероятно, следует использовать @property
и @synthesize
d, если возможно, метод получения / установки. Для этого добавьте
@property (copy,readwrite) NSDictionary * accountDictionary;
объявление в класс @interface
. И добавьте директиву @synthesize accountDictionary;
в блоке @implementation
для вашего класса контроллера.