2014-02-06 4 views
0

Недавно я прочитал this post и подумал, что было бы неплохо использовать советы из статьи. Я использую его в блоках, но должен ли я также использовать его в «блоке» ниже. Является ли «блок» ниже реального блока?weakSelf при установке рамки

avatar.frame = ({ 
    CGRect frame = avatar.frame; 
    frame.origin.y = CGRectGetMaxY(self.view); 
    frame; 
}); 

Это стало бы:

__weak typeof(self)weakSelf = self; 
avatar.frame = ({ 
    __strong typeof(weakSelf)strongSelf = weakSelf; 

    CGRect frame = avatar.frame; 
    frame.origin.y = CGRectGetMaxY(strongSelf.view); 
    frame; 
}); 
+5

Нет, это не настоящий ObjC блок. Это разрешено расширением компилятора. Вам не нужно слабо себя. –

+0

@MaciejOczko Спасибо, но мне нужно делать это в обычных блоках, не так ли? – yoeriboven

+0

@yoeriboven: Это действительно зависит от того, как используется блок. Выполняется ли блок синхронно или асинхронно? Он хранится в некоторой коллекции для последующего исполнения или нет? Вы хотите, чтобы вы сохраняли сильную ссылку на себя или нет? Нет ответа «один подходит всем». –

ответ

2

Это не блок. Это расширение GCC C, которое вызывает код , чтобы вернуть значение, если оно заключено в скобки и круглые скобки.

Это не только сегрегируется сведения о конфигурации в инициализацию, но дополнительная сфера позволяет родовые имена переменных, как рама, кнопки, и цели быть повторно использован в последующих инициализациях. Не более loginButtonFrame = .../signupButtonFrame = ...!

Источник: http://nshipster.com/new-years-2014/

1

Это не начало блок, блок с ^. Я считаю, что этот код:

({ 
    CGRect frame = avatar.frame; 
    frame.origin.y = CGRectGetMaxY(self.view); 
    frame; 
}); 

способ создать CGRect.

+1

Не обязательно плохо. Это выражение «составное выражение» и позволяет вам, например, использовать локальные переменные в выражении. –

+0

@MartinR от плохого Я имею в виду, что этот конкретный пример не будет работать. – Greg

+0

Да, почему «плохо»? –

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