В Objective-C вы можете использовать переменную экземпляра внутри блока и сохранить этот блок в самом объекте. Если вы сделаете это, вы столкнетесь с довольно хлопот, чтобы убедиться, что вы не создаете циклическую зависимость, и, чтобы заставить замолчать все предупреждения компилятора:Есть ли какой-либо путь помимо слабого/сильного танца, чтобы использовать переменную экземпляра в блоке?
@implementation TestBlock {
int someVariable;
void (^someBlock)();
}
- (void) createBlock
{
// ideally I would like to use:
someBlock = ^{
someVariable++;
};
// but in reality I need to use:
TestBlock * __weak weakSelf = self;
someBlock = ^{
TestBlock *strongSelf = weakSelf;
strongSelf->someVariable++;
};
}
@end
Если weakSelf
используется вместо strongSelf
, то вы» будет получать сообщение об ошибке:
Dereferencing a __weak pointer is not allowed
Если вы используете self
непосредственно, а затем сохранить цикл создается.
Я знаю, почему это необходимо, но действительно ли нет более простого способа использовать переменную экземпляра внутри блока? Любые практические подходы, которые вы использовали, чтобы сделать это более коротким и читаемым?
У вас нет другого выхода для прямого доступа к ivar. Но у вас есть возможность использовать свойство вокруг ivar. Затем вы можете получить доступ к свойству с помощью 'wealSelf'. – rmaddy
Если вам нужно получить доступ к ivar, вы можете использовать макросы «@weakify» и «@strongify» , что делает его немного более удобочитаемый. –
Суть заключается в том, чтобы избежать блоков в качестве иваров. Например, вы можете перепроектировать свой класс, чтобы он мог иметь методы, которые принимают блок как параметр. – CouchDeveloper