1

我正在使用 AFNetworking 方法将我的图像加载到 UIBUttons 中。我的目标是在加载后显示带有淡入淡出动画的图像。

     [leftBtn setImageWithURLRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:leftImageUrl]] placeholderImage:nil forState:UIControlStateNormal success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image) {
                 [UIView animateWithDuration:0.4 animations:^() {leftBtn.alpha = 1;}completion:^(BOOL finished){}];
            } failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error) {
                //
            }];

Capturing 'leftBtn' strongly in this block is likely to lead to a retain cycle

我明白为什么我会收到上述警告并寻找一种聪明的方法来解决它。谢谢

4

1 回答 1

5

你应该使用类似的东西:

__weak UIButton *weakLeftBtn = leftBtn;
[leftBtn setImageWithURLRequest:[NSURLRequest requestWithURL:[NSURL      
                                               URLWithString:leftImageUrl]] 
               placeholderImage:nil 
                       forState:UIControlStateNormal 
                        success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image) {

                              [UIView animateWithDuration:0.4 animations:^() {

                                   weakLeftBtn.alpha = 1;

                              }completion:^(BOOL finished){}];
               } failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error) {
           // if something went wront
}];

更新:在您的代码leftBtn中指向一个块,而该块又指向leftBtn. 这会导致一个保留周期。在我的代码leftBtn中指向块,但块指向weakLeftBtn,它是用限定符声明的,这意味着只要它还活着__weak,它就会正确指向,而不与它保持牢固的关系。leftBtn所以在这种情况下leftBtn“拥有”块,但块不“拥有”任何局部或实例变量。

关于这个主题的一些值得阅读的内容:

于 2013-10-08T08:34:43.297 回答