0

Я читал документацию на 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 

ответ

2

Вы должны использовать следующее заявление:

@property (nonatomic, copy) MyCompletionHandler completionHandler; 

С assign ваш блок не будет сохранен, но copy будет выполнять Block_copy автоматически.

+0

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

+0

Как я знаю, среда выполнения Objective-C рассматривает 'strong' то же самое, что и' copy' для блоков. И «копировать» с помощью блоков означает другое, чем «копировать» с объектами. Я бы посоветовал прочитать эту статью по теме: http://www.informit.com/articles/article.aspx?p=1749597 – Stream

+3

@Stream 'strong' не обрабатывается так же, как' copy' - последний гарантирует, что блок включен или перемещен в кучу _, а затем также сохраняется; в то время как первый будет гарантировать, что он будет сохранен (и, следовательно, все еще может быть в стеке). –

2

Вы должны скопировать блоки при назначении их к переменным - в этом случае вы можете либо изменить completionHandler свойство иметь (nonatomic, copy) атрибуты, или использовать Block_copy при назначении блока, как вы сказали.

+0

, но, насколько я понимаю, объектная-C-копия не такая же, как функции копирования уровня c. Они совершенно разные. Так изменилось ли свойство для копирования, выполнив эту работу должным образом? Будет ли запуск Block_copy для вызова? – aryaxt

+2

Из документов: http://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Blocks/Articles/bxUsing.html#//apple_ref/doc/uid/TP40007502-CH5-SW2 – ehope

+1

@aryaxt: 'Block_copy (someBlock)' такой же, как '[someBlock copy]'; и 'Block_release (someBlock)' такой же, как '[someBlock release]'. Первый используется, когда в C/C++ и у вас нет Objective-C. Последний следует за традиционным синтаксисом в Objective-C. – newacct

Смежные вопросы