Я читал документацию на Grand Central Dispatch, и есть две функции: Block_copy
и Block_release
. В соответствии с документацией эти методы используются при вызове dispatch_async
для управления памятью блока. Предполагаю ли я сделать то же самое в своем коде?Objective-C - Использование блоков и управления памятью?
Есть ли проблема с моим кодом ниже?
typedef void (^MyCompletionHandler)(NSError *error)
@interface ServiceClient
- (void)fetchWithCompletionHandler:(MyCompletionHandler)completionHandler;
@property (nonatomic, assign) MyCompletionHandler completionHandler;
@end
@implementation ServiceClient
@synthesize completionHandler = _completionHandler;
- (void)fetchWithCompletionHandler:(MyCompletionHandler)completionHandler
{
self.completionHandler = completionHandler;
[self performSelectorInBackground:@selector(fetchInBackground)];
}
@end
Есть ли проблема с использованием сильных вместо копирования? Зачем мне нужна копия, когда я мог бы сохранить объект? – aryaxt
Как я знаю, среда выполнения Objective-C рассматривает 'strong' то же самое, что и' copy' для блоков. И «копировать» с помощью блоков означает другое, чем «копировать» с объектами. Я бы посоветовал прочитать эту статью по теме: http://www.informit.com/articles/article.aspx?p=1749597 – Stream
@Stream 'strong' не обрабатывается так же, как' copy' - последний гарантирует, что блок включен или перемещен в кучу _, а затем также сохраняется; в то время как первый будет гарантировать, что он будет сохранен (и, следовательно, все еще может быть в стеке). –