#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 , я удалил его для ясности из вопроса, но мой вопрос все еще остается в силе: что произойдет, если за прошедшее время пользователь закрыл это представление и оно было освобождено? Блок не сохраняет / освобождает это автоматически, не так ли?