В этом справочнике Apple есть концептуальный обзор объектов Blocks в Objective-C:
http://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/Blocks/Blocks.pdf
Однако на самом деле это не объясняет две темы, которые волнуют меня и могут волновать других людей. Первый вопрос таков: могу ли я присвоить nil ссылке Block? Или я должен использовать NULL? Или я могу использовать ни один из них?
Вторая проблема лежит в сфере управления памятью. Скажем, я объявил такой метод, создающий блочный объект в стеке.
-(void)makeTheClass
{
TheClass *object = [[TheClass alloc] init];
object.blockReference = ^(void) { return nil; }
}
Этот объект, созданный в какой-то области видимости, будет уничтожен после того, как выйдет из нее. Но объект TheClass на самом деле будет хранить ссылку на этот (почти уничтоженный) блок:
typedef id (^WeirdBlockType)(void);
@interface TheClass {
WeirdBlockType blockReference;
}
Как объявить свойство класса для такого блока? В чем разница между этими двумя:
@property (nonatomic, retain) WeirdBlockType blockReference;
@property (nonatomic, copy) WeirdBlockType blockReference;
?
В документации Apple четко сказано, что блочное копирование перемещает блок в кучу. Но что, если я просто сохраню его? Будет ли он уничтожен после того, как выйдет из области действия метода makeTheClass
?