В target-c есть какой-нибудь способ проверить, не была ли выпущена переменная к моменту вызова лямбды? - PullRequest
1 голос
/ 27 апреля 2011

В target-c, есть ли способ проверить, не была ли выпущена переменная к моменту вызова лямбды?

-(void) loadImageIntoImageView:(UIImageView*) imgView
{
    [MyLibrary getImageFromWebSlowly complete:^(UIImage *img, BOOL success) {
        // What if this bit of code is called 50 seconds later,
        // and by that time the imgView was dealloc'd or released?
        // Eg by that time the user closed the view with the image view on it.
        imgView.image = img;
    }];
}

Есть предложения?

(отредактировано для ясности)

Ответы [ 2 ]

2 голосов
/ 27 апреля 2011

Короче, не используйте __block или, что более сложно, присваивайте nil переменной __block, когда она освобождается.

Как написано, нет необходимости в ключевом слове __block в этом коде , если вы явно не хотите использовать слабую ссылку на imgView (что, вероятно, вам не нужно).

2 голосов
/ 27 апреля 2011

Я думаю, что вы имеете в виду «освобожден», а не выпущен, и без сборки мусора на iOS это невозможно. Вы должны использовать другой метод, чтобы определить, пропал ли UIImageView.

Кроме того, я не думаю, что __block делает то, что вы думаете, делает; почитайте о том, как блочные переменные работают .

...