Objective-c Асинхронное управление памятью - PullRequest
1 голос
/ 10 июля 2011

Я осмотрелся, но не смог найти однозначного ответа на этот вопрос.

Если у меня есть класс, который выполняет асинхронную операцию, когда и как я могу ее освободить?*

-(void)main 
{
     AsyncObject *async = [[AsyncObject alloc] initWithDelegate:self];

     [async goDoSomething];
}

-(void)didSomething:(Result*)result 
{   

}

Когда я освобождаю * async?

Ответы [ 3 ]

2 голосов
/ 10 июля 2011

Вы можете оставить приватное свойство для сохранения значения или, если у вас есть контроль над AsyncObject, передать экземпляр в селектор didSomething:.Я думаю, что первый вариант лучше, так как вы знаете, что объект будет сохраняться до тех пор, пока вы не получите вызов делегата.

Опция 1:

ClassName.m

@interface ClassName ()
    @property (nonatomic, retain) AsyncObject* async;
@end

@interface
//...

-(void)main 
{
 async = [[AsyncObject alloc] initWithDelegate:self];

 [async goDoSomething];
}

-(void)didSomething:(Result*)result 
{   
    [async release];
    async = nil;
}

Опция2:

-(void)aysncObject:(AsyncObject*)async didSomething:(Result*)result {
    [async release];
}
1 голос
/ 10 июля 2011

Если ваш объект выполняет свою асинхронную задачу в фоновом потоке, или является целью таймера, или использует GCD и на него ссылаются в пределах объема отправляемого блока (^ {} kerjigger), тогда он будет сохранен для вас за время жизни этой фоновой операции.

Итак, нормальный вариант использования:

 AsyncObject *async = [[AsyncObject alloc] initWithDelegate:self];
 [async goDoSomething];
 [async release];

Теперь можно работать в фоновом режиме с объектом, который не сохраняется (например, используя __block -объектную ссылку на объект с GCD или отсоединяя ваш рабочий поток с помощью pthreads вместо NSThread / NSOperation), но нет типичных случаев использования, которые я мог бы придумать, где бы это ни произошло. В таком случае вы должны убедиться, что -goDoSomething внутренне сохраняет и освобождает self на время операции.

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

0 голосов
/ 10 июля 2011

Спасибо за помощь, ребята, я немного поэкспериментировал с NSURLConnection, чтобы посмотреть, как он с этим справляется (поскольку вы автоматически высвобождаете его, и он продолжит асинхронные операции).

Оказывается, в начале каждого асинхронного шага он внутренне увеличивает свой счет удержания, а в конце каждого асинхронного шага он сам освобождает себя.

Это означает, что он может быть отправлен авто-релиз / выпуск и фактически не будет выпущен, пока не завершит свою текущую операцию.

// MAIN.M

-(void)main 
{
     AsyncObject *async = [[[AsyncObject alloc] initWithDelegate:self] autorelease];

     [async goDoSomething];
}

-(void)didSomething:(Result*)result 
{   

}

// ASYNCOBJECT.M

-(void) goDoSomething
{
   [self retain];
}

-(void) finishedDoingSomething
{
   [delegate didSomething:result];
   [self release]
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...