【问题标题】:Confusion over how I should use weakSelf in blocks对如何在块中使用weakSelf感到困惑
【发布时间】:2015-05-06 06:00:22
【问题描述】:

我的代码中有很多块。我有一个在登录时初始化用户的过程,我使用 Parse.com 作为我的后端:

PFQuery *messageBankQuery = [PFQuery queryWithClassName:@"messageBank"];
        [messageBankQuery whereKey:@"username" equalTo:[PFUser currentUser].username];
        [messageBankQuery getFirstObjectInBackgroundWithBlock:^(PFObject *object, NSError *error) {


            if(!error){

                [self setupUserWithMessageBank:object];

            }//end no error if


            else{

                NSLog:(@"error");

           }

}];

messageBank 是一个解析对象,它包含对用户拥有的所有消息的引用。如果找到该对象,则在块中调用 setupUserWithMessageBank。 setupUserWithMessageBank 还做了更多的块工作:

-(void)setupUserWithMessageBank: (PFObject *)object{


    __weak FriendsViewController *weakSelf = self;

    //2.)Init the user
    weakSelf.currentUser = [[appUser alloc] initWithParseUser:[PFUser currentUser] andMessageBank:object];

    //3.) Setup that message array
    [weakSelf.currentUser setupMessagedTodayWithHandler:^(BOOL successful) {

        if(successful){


            //4.)Add friends to the array
            [weakSelf.currentUser populateFriendsArrayWithCompletionHandler:^(BOOL successful, NSError *error, BOOL addSelf, BOOL alreadyFriends) {

                if(successful){

                    [self.indicator stopAnimating];
                    [self.indicator removeFromSuperview];
                    [self.tableView reloadData];

                    __weak FriendsViewController *weakSelf = self;
                    [weakSelf.currentUser refreshMessagesArrayWithCompletionHandler:^(BOOL successful, BOOL newMessages) {

                        if(successful) {


                            //set the button
                            [self.navigationItem.rightBarButtonItem setAction:@selector(showMessages)];

                        }

                        else{

                            [weakSelf displayGeneralError];
                        }


                    }];//end fill messages



                }

                else{

                    [weakSelf displayGeneralError];

                }



            }];//end populate method call




        }

        else{

            [weakSelf displayGeneralError];

        }
    }];




}

我对使用weakSelf 有点困惑。可以在 setupUserWithMessageBank 方法的开头声明 weakSelf 吗?因为他的方法是在另一个块内调用的,所以从技术上讲,它是在一个块内创建的。我需要在方法中传递weakSelf吗?

我也不完全确定应该在哪里使用weakSelf。我需要用它来关闭活动指示器吗?任何关于我使用这个的指针都将非常感激。谢谢!

【问题讨论】:

    标签: ios objective-c parse-platform objective-c-blocks


    【解决方案1】:

    如果您实际上在self 中保留对块的引用(或者可能是传递性地,将块保存在保存在自身内的对象中),您可能只需要使用weakSelf,在这种情况下,不会看起来你在做什么。真正在块中使用weakSelf 的唯一原因是避免保留循环。

    如果两个块的生命周期都很短,那么在块内使用self 可能是安全的。 (如果您对块的生命周期有任何控制权,请确保在执行后将它们设置为 nil,如果由于某些故障而没有被执行,请确保它们被清除,以免它们闲逛)

    【讨论】:

    • 是的,所有块的生命周期都很短,如果块失败它只会显示错误消息并被销毁。
    • 那么按原样使用self应该没问题,如果你为self实现dealloc方法并在其中设置一个断点,你可以确保它被正确删除并在那里没有保留周期
    猜你喜欢
    • 2015-12-24
    • 2022-01-04
    • 2021-04-21
    • 1970-01-01
    • 1970-01-01
    • 2011-02-26
    • 1970-01-01
    • 1970-01-01
    • 2015-05-16
    相关资源
    最近更新 更多