У меня большой опыт работы с JavaScript, и я как можно лучше перехожу на Objective-C. Естественно, я всегда хватаюсь за возможность использовать замыкающие функции в моем исходном коде, например:
@property (nonatomic, retain) void (^zoomCallback)(NSInteger width, NSInteger height, NSString *url);
Однако каждый раз, когда я записываю это в Xcode, он предупреждает меня:
Свойство Retained block не копирует блок — вместо этого используйте атрибут copy
Насколько я понимаю, вам больше не нужно сохранять вещи вручную в Objective-C из-за ARC, поэтому я, по общему признанию, довольно удивлен этим предупреждением. Я предполагаю, что по блоку это относится к моей функции закрытия, поэтому, насколько я могу интерпретировать, это говорит мне, что назначение этой переменной:
myObject.zoomCallback = someMethod;
Также приведет к тому, что someMethod будет сохранен, и, таким образом, владелец someMethod продолжит существовать? Я правильно понял?
Каковы негативные последствия этого? Если я «скопирую» блок, не позволит ли он уничтожить владельца someMethod, и, таким образом, в самом методе закрытия каждый раз, когда я ссылаюсь на «я», он больше не будет существовать? Разве я не хочу почти всегда сохранять блок, если только мой метод закрытия не делает что-то очень тривиальное или что-то, что не ссылается на переменные-члены или методы?
retain
наcopy
, чтобы решить эту проблему. - person Sergey Kalinichenko   schedule 04.08.2013strong
вместоretain
. - person jscs   schedule 04.08.2013