Простой, но, возможно, проблематично ответ, просто чтобы получить доступ к нему, как вы делаете другие свойства:
viewController.rowLabels = @[@"Hello", @"World"];
viewController.testBlock = ^(NSInteger itemIndex) {
... viewController.foo ...
};
С ваш фрагмент мы не можем знать, что такое viewController
- например это может быть локальная переменная из метода, в котором находится этот фрагмент, или глобальной переменной и т. д. Если вы просто читаете значение в viewController
, как вы здесь, это не имеет значения [1].
Вышеупомянутые работы, но может возникнуть проблема: у вас, вероятно, есть сильный справочный цикл. Экземпляр viewController
ссылается на блок через его свойство testBlock
, а блок ссылается на экземпляр viewController
. Если обе эти ссылки сильны (вероятно), тогда у вас есть циклическая зависимость и экземпляр viewController
, и блок никогда не может быть освобожден системой. Вы можете разорвать этот порочный круг, используя слабый ссылку:
viewController.rowLabels = @[@"Hello", @"World"];
__weak ViewController *weakViewController = viewController; // make a weak reference to the instance
viewController.testBlock = ^(NSInteger itemIndex)
{
// temporarily make a strong reference - will last just as long as the block
// is executing once the block finishes executing the strong reference is
// removed and no strong reference cycle is left.
ViewController *myController = weakViewController;
// only execute if the `ViewController still exists
if (myController != nil)
{
... myController.foo ...
}
};
НТН
[1] отмечают, что значение, которое вы читаете, ссылка на ViewController
, например, и вы можете изменить свойство этого экземпляра, то, что вы не можете сделать (и не пытаетесь сделать), - это изменить экземпляр ссылок viewController
, если viewController
является локальной переменной.
, пожалуйста, прочитайте главный ответ здесь: http://stackoverflow.com/questions/4352561/retain-cycle-on-self-with-blocks – cdstamper
Вам нужно будет предоставить нам больше информации о том, что вы намерены делать. – vikingosegundo