Сбой доступа к свойству блока Objective-C после переключения приложения - PullRequest
0 голосов
/ 24 февраля 2012

Я создал оболочку для iOS SDK FBConnect, которая объявляет свойство блока для выполнения некоторого кода после успешного входа в систему.Соответствующий код выглядит следующим образом:

typedef void(^FacebookServiceLoginBlock)(BOOL loginSuccessful);

@interface FacebookService : NSObject <FBSessionDelegate,FBRequestDelegate>
@property (nonatomic, copy) FacebookServiceLoginBlock loginBlock;
- (void) checkAuthorization:(FacebookServiceLoginBlock)loginBlock;
@end


@implementation FacebookService
@synthesize loginBlock;


- (void) checkAuthorization:(FacebookServiceLoginBlock)block {
    if (![self.facebook isSessionValid]) {
        self.loginBlock = block;

        // do Facebook auth
    } else {
        if (block) {
            block(YES);
        }
    }
}

- (void)fbDidLogin {
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [defaults setObject:[self.facebook accessToken] forKey:@"FBAccessTokenKey"];
    [defaults setObject:[self.facebook expirationDate] forKey:@"FBExpirationDateKey"];
    [defaults synchronize];

    self.loginBlock(YES);
}

Вызывающий код просто вызывает метод checkAuthentication с блоком, который практически ничего не делает, только одна строка типа int i=0;, поэтому я могу добавить точку останова,В случае, если пользователь уже вошел в систему и блок вызывается немедленно, все работает нормально.Однако, если происходит аутентификация FB, и приложение переключается на Safari или приложение FB для авторизации, по возвращении, когда вызывается делегат успешного входа в FB, приложение падает на self.loginBlock(YES);Если я оберну его в if (self.loginBlock), он будет пропущен, что заставит меня поверить, что это свойство равно nil, но если я напечатаю описание в отладчике, оно получит имя класса " FacebookService ».Другое важное замечание, это под ARC.

Я действительно нахожусь в тупике, любая помощь будет отличной.

1 Ответ

0 голосов
/ 24 февраля 2012

Через несколько часов после публикации я понял, в чем проблема. Я использую другой экземпляр FacebookService из контекста, в котором я запускаю логин и отвечаю на сообщение openURL Я собираюсь изменить вещи только на один экземпляр, и все будет хорошо.

...