iOS7后台获取EXC_BAD_ACCESS

时间:2013-11-13 16:19:54

标签: ios background fetch

我正在尝试实现一个后台获取方法来获取新数据,但是它给了我一个NSMutable Dictionary错误。这是我的代码

在我的appDelegate中,在performFetchWithCompletionHandler下我有:

    UINavigationController *navigationController = (UINavigationController*) self.window.rootViewController;

id topViewController = navigationController.topViewController;

if ([topViewController isKindOfClass:[viewController class]])
{
    [(viewController*)topViewController autologin];
}
else
{
    completionHandler(UIBackgroundFetchResultNewData);
}

这会在我的视图控制器中调用自动登录

- (void) autologin
{

NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];

NSString* username = [defaults valueForKey:@"username"];

NSString* password = [defaults valueForKey:@"password"];

[self login:username password:password];
}

然后调用login

- (void)login:(NSString*)username password:(NSString*) password
{
NSDictionary *login = [[NSDictionary alloc] initWithObjectsAndKeys:username, @"username", password, @"password", NO, @"showNotification", nil];

NSOperationQueue* backgroundQueue = [NSOperationQueue new];

ch = [[backgroundProcess alloc] init];

NSInvocationOperation* operation = [[NSInvocationOperation alloc] initWithTarget:ch selector:@selector(runEvents:) object:login];

[backgroundQueue addOperation:operation];

operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(checkStatus) object:nil];

[backgroundQueue addOperation:operation];
}

如果我的应用程序在前台运行并且我调用了登录函数,那么一切正常,但是只要它点击就会执行performFetchWithCompletionHandler

NSDictionary *login = [[NSDictionary alloc] initWithObjectsAndKeys:username, @"username", password, @"password", NO, @"showNotification", nil];

我得到了EXC_BAD_ACCESS。任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:0)

不确定为什么你只是从后台崩溃。我看到的一个错误是你不能直接在字典中使用“NO”(标量BOOLEAN值)。 NSDictionary对象只能包含对象。您需要将NO值转换为NSNumber。使用最新版本的Objective C,您可以使用语法@(NO)将标量转换为NSNumber。这相当于

[NSNumber numberWithBool: NO];

我怀疑这是否是您崩溃的原因,但是您的代码中存在错误。

我不知道NSInvocationOperation的对象所有权规则是我的头脑。自从引入GCD以来,我没有使用过NSOperations或NSOperationQueues。您可能想要考虑使用基于GCD的调用。