首页 > 解决方案 > 调用完成块时ObjectiveC崩溃

问题描述

在网络调用之后调用块时,我遇到了崩溃。这是代码:

- (void) signInUser:(NSString*) username
           password:(NSString*)password
            success: (void(^)())success
            failure:(void(^)(NSError *error))failure
{
    self.api.username = username;
    self.api.password = password;

    [self.api getAuthorityFeatureStatusCompletion:^(NSDictionary *dict) {

        //successfully auth, save the credentials
        [SSKeychain setPassword:password
                     forService:[[NSBundle mainBundle] bundleIdentifier]
                        account:username];


        NSString *accountCodesEnabled = [[dict valueForKey:@"AccountCodesEnabled"] stringValue];
        NSString *isVismaEnabled = [[[dict valueForKey:@"VocuherAccounting"] valueForKey:@"IsEnabled"] stringValue];


        if ([accountCodesEnabled isEqualToString:@"1"]) {

            [[NSUserDefaults standardUserDefaults] setObject:accountCodesEnabled forKey:@"AccountCodesEnabledStatus"];

            [[NSUserDefaults standardUserDefaults] setObject:isVismaEnabled forKey:@"GetStatusOfVismaEnabled"];

        } else {
            [[NSUserDefaults standardUserDefaults] setObject:@"0" forKey:@"GetStatusOfVismaEnabled"];
        }

        //as we were able to sign in, get the other data we need for app to work



        success();           <============ crashes when calling this guy

    }
                                 andErrorHandling:^(NSError *error) {
        //we could not get the info for some reason, abandon
        api.username = nil;
        api.password = nil;
        failure(error);
    }];




}

我检查了一下,我的成功块不是零,奇怪的是,如果我注释掉 success() 调用上方的代码,它可以正常工作。因此,它向我表明该块可能没有正确保留,但我不确定如何去修复它。我尝试在每个范围内复制块,但这也没有解决它。

崩溃是:线程 11:EXC_BAD_ACCESS(代码=1,地址=0x6b0b),控制台中没有数据,堆栈跟踪

#0  0x00007fff50bad357 in objc_retain ()
#1  0x00007fff50bad65d in objc_storeStrong ()
#2  0x00000001083f600b in __29-[LoginViewController login:]_block_invoke at /Users/otusweb/Projects/MoreFlo/ISUPOS/Controllers/View Controller/LoginViewController.m:309
#3  0x000000010842b72e in __51-[UserManager signInUser:password:success:failure:]_block_invoke at /Users/otusweb/Projects/MoreFlo/ISUPOS/Managers/UserManager.m:78
#4  0x00000001085bb221 in -[APIMaster handleAPIResponseWithData:response:error:success:failure:] at /Users/otusweb/Projects/MoreFlo/ISUPOS/Models/WebClasses/APIMaster.m:697
#5  0x00000001085b5a21 in __66-[APIMaster getAuthorityFeatureStatusCompletion:andErrorHandling:]_block_invoke at /Users/otusweb/Projects/MoreFlo/ISUPOS/Models/WebClasses/APIMaster.m:88

以及我调用此方法的代码(在点击按钮时调用):

[self.userManager signInUser:self.textFieldEmail.text
                        password:self.textFieldPassword.text
                         success:^(NSDictionary *dict) {
        //successfully auth,
        dispatch_async(dispatch_get_main_queue(), ^{

            [MBProgressHUD hideHUDForView: self.view animated:true];
        });
    }

有什么线索吗?

标签: objective-cclosures

解决方案


推荐阅读