Выпуск параметра - PullRequest
       7

Выпуск параметра

0 голосов
/ 07 апреля 2011

скажем, если у вас есть класс, делающий что-то в другом потоке.И имеет свой делегат.

@protocol XRequestDelegate;

@interface XRequest : NSObject {
    id<XRequestDelegate> delegate;
}
@property (nonatomic, retain) id<XRequestDelegate> delegate;

- (void) doSomething;
@end


@protocol XRequestDelegate <NSObject>

- (void)request:(XRequest *)request didFinish:(id)object;
- (void)request:(XRequest *)request didFailWithError:(NSError*)error;

@end

doSomething в конечном итоге вызывает либо request:didFinish:, либо request:didFailWithError:

и позволяет использовать этот класс в нашем объекте;

- (void)doRequest
{
    XRequest *request = [[XRequest alloc] init];
    [request setDelegate:self];
    [request doSomething];
}

- (void)request:(XRequest *)request didFinish:(id)object
{
    // Use object whatever you want
    [request release];
}

- (void)request:(XRequest *)request didFailWithError:(NSError *)error
{
    //Log Error
    [request release];
}

у нас есть экземпляр XRequest выделено и в итоге выпущено методами.

Можно ли сказать, что это неправильный способ управления памятью.Должны ли мы расширить область действия XRequest объекта?

Ответы [ 2 ]

0 голосов
/ 07 апреля 2011

Apple фундаментальное правило управления памятью гласит:

Вы выпускаете или автоматически выпускаете только свои собственные объекты.

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

0 голосов
/ 07 апреля 2011

Я видел, как примеры яблок делают это таким образом (я считаю, что это один из медиаплееров), но я бы сказал, что это неправильный способ управления памятью. Что произойдет, если класс, ссылающийся на XRequest, будет освобожден до завершения XRequest? Как вы предотвращаете любые дальнейшие вызовы делегатов или отпускаете их.

То, что вы хотите сделать, это сохранить запрос в ivar, а затем удалить его делегат, освободить его и установить его равным nil в методах finish / fail и в -(void)dealloc.

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