2013-07-15 2 views
-1

У меня есть метод, который содержит блок анимации. Я пытаюсь передать свойство класса в качестве аргумента для метода и назначить ему значение nil внутри блока.Передача аргумента методу, содержащему значение блока и присваивания

-(void)endPinching:(UIViewController *)pinchedController{ 

    // a bunch of code 

    [UIView animateWithDuration:0.2 animations:^{ 
     //do stuff 

    } completion:^(BOOL finished) { 

     // do other stuff 

     pinchedController = nil; //HERE IS THE PROBLEM!! 
    }]; 
    } 
} 

Так что, если я называю этот метод в классе, что называется в, pinchController является self.pinchController и, следовательно, может быть установлен в ноль внутри блока. Но здесь, в определении, я получаю ошибку компиляции:

"variable not assignable, missing block type specifier" 

Итак, я попытался добавить блок спецификатор, выполнив:

__block pinchedController = nil; 

компилятор говорит:

"unused variable pinchedViewController" 

Я предполагаю, что это означает, что pinchedController теперь считается новой переменной и не связан с параметром метода.

Мой вопрос: есть ли способ передать pinchedViewController в качестве аргумента и присвоить его нулю в этом блоке?

+0

Какой смысл устанавливать локальную переменную (в этом случае «nil»), а затем не использовать ее снова? – newacct

ответ

0

Если вы правильно поняли, вы хотите явно освободить данный объект. Это невозможно из-за того, как работает подсчет ссылок.

Пройдя UIViewController до endPinching:, вы увеличиваете пересчет объекта на единицу. Установка указателя (который является локальной переменной в стеке) на nil приведет к уменьшению количества ссылок на 1, но поскольку это все еще переменная экземпляра вашего класса, она не будет освобождена.

Итак, сначала спросите себя, почему вы хотите освободить такой объект. Это можно решить, улучшив разработку кода или пытаясь понять, почему ваш контроллер представления занимает большой объем памяти.

Если вы все еще хотите освободить выделение, вы можете явно указать self.pinchController = nil в своем методе или позвонить кому-то из делегатов, которые сделают это (мне нужно больше конкретизировать дизайн контроллера контура).

+0

Почти; в этом случае 'pinchedController' является аргументом метода, и этот аргумент будет длинным, длинным, ушедшим к тому моменту, когда выполняется блок завершения (поскольку анимации асинхронны). Таким образом, «pinchedController» подразумевал сильную ссылку в этом аргументе, он мертв и ушел. – bbum

+0

Если я не ошибаюсь, блок завершения должен содержать сильную ссылку на все его закрытие, также захватывая 'pinchedController'. Нет? – StatusReport

+0

Да, но эта ссылка является сохраненной копией. Параметр 'pinchedController'/локальная переменная давно ушел, потому что метод' endPinching: 'возвращался задолго до того, как выполняется окно завершения. – bbum

Смежные вопросы