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

#objective-c #lambda #objective-c-blocks

#objective-c #лямбда #objective-c-блоки

Вопрос:

В objective-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;
    }];
}
  

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

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

Ответ №1:

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

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

Комментарии:

1. Вы правы, мне не нужен __block , поэтому я удалил его для ясности из вопроса (и моего кода), но мой вопрос все еще остается в силе: что произойдет, если за прошедшее время пользователь закрыл это представление и оно было освобождено? Блок не сохраняет / освобождает это автоматически, не так ли?

2. Блок сохранит все захваченные ссылки на объекты при копировании блока (что и будет в этом коде, при условии, что он реализован правильно) и автоматически освободит их при освобождении блока.

Ответ №2:

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

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

Комментарии:

1. Спасибо за объяснение __block , я удалил его для ясности из вопроса, но мой вопрос все еще остается в силе: что произойдет, если за прошедшее время пользователь закрыл это представление и оно было освобождено? Блок не сохраняет / освобождает это автоматически, не так ли?