/* Вместо этого используем метод-установщик */
self.stringProperty = @"Block Objects"; /* Ошибка времени компиляции */
/* Вместо этого используем метод-получатель. */
NSLog(@"self.stringProperty = %@",
self.stringProperty); /* Ошибка времени компиляции */
};
В данном сценарии будем пользоваться методом-установщиком и методом-получателем синтезированного свойства:
void (^correctBlockObject)(id) = ^(id self){
NSLog(@"self = %@", self);
/* Это будет работать нормально. */
[self setStringProperty:@"Block Objects"];
/* Это также будет работать нормально. */
NSLog(@"self.stringProperty = %@",
[self stringProperty]);
};
Когда дело касается встраиваемых блоковых объектов, необходимо учитывать лишь одно
typedef void (^BlockWithNoParams)(void);
— (void) scopeTest{
NSUInteger integerValue = 10;
BlockWithNoParams myBlock = ^{
NSLog(@"Integer value inside the block = %lu",
(unsigned long)integerValue);
};
integerValue = 20;
/* Вызываем блок здесь после изменения
значения переменной integerValue. */
myBlock();
NSLog(@"Integer value outside the block = %lu",
(unsigned long)integerValue);
}
Мы определяем целочисленную локальную переменную и сначала присваиваем ей значение 10. Затем реализуем блоковый объект, но
Integer value inside the block = 10
Integer value outside the block = 20
Вот что здесь происходит. Блоковый объект сохраняет для себя копию переменной integerValue, доступную только для чтения, и делает это именно там, где реализуется блок. Напрашивается вопрос: почему же блоковый объект принимает
— (void) scopeTest{
__block NSUInteger integerValue = 10;
BlockWithNoParams myBlock = ^{
NSLog(@"Integer value inside the block = %lu",
(unsigned long)integerValue);
};
integerValue = 20;
/* Вызываем блок здесь после изменения
значения переменной integerValue. */
myBlock();
NSLog(@"Integer value outside the block = %lu",
(unsigned long)integerValue);
}
Теперь, если вывести на консоль результаты после вызова метода scopeTest, мы увидим следующее:
Integer value inside the block = 20
Integer value outside the block = 20