Нужно ли сохранять автоматически выпущенные объекты? - PullRequest
4 голосов
/ 09 июня 2010

Я использую библиотеку ASIHTTPRequest и хочу быть уверенным, правильно ли я ее использую с точки зрения управления памятью.Я создаю:

ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:someUrl];

Я предполагаю, что в соответствии с соглашением об именах мне не нужно сохранять объект запроса, верно?но когда я смотрю на код метода requestWithURL: someUrl, я вижу:

+ (id)requestWithURL:(NSURL *)newURL
{
return [[[self alloc] initWithURL:newURL] autorelease];
}

, поэтому возвращаемый объект автоматически освобождается.Разве я не должен сохранить это в своем коде?

Ответы [ 2 ]

4 голосов
/ 21 октября 2011

Если вы используете объект autorelease в методе, вы не должны сохранять его, так что все в порядке:

- (void) myMethodDoRequest
{
    ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:someUrl];
    // use request within this scope only
}

Если вы хотите сохранить объект autorelease в ivar, вам нужно сохранить, чтобы расширить жизненный цикл.объекта, и последний выпуск, чтобы избежать утечки:

@interface MyClass
{
    ASIFormDataRequest *request;
}

и

- (void) myMethodStoreRequest
{
    [request release];
    request = [[ASIFormDataRequest requestWithURL:someUrl] retain];
}

- (void) dealloc
{
    [request release];
}
3 голосов
/ 09 июня 2010

Как правило, нет - поскольку он автоматически освобождается, он сохраняется в пуле автоматического выпуска, и он освобождает его, когда он выходит из области видимости.Однако вы можете сохранить и затем разблокировать его, если вам нужна дополнительная защита, которая обеспечивает.

...