Объем автовыпуска

Вам не нужно звонить func sign(_ signIn: GIDSignIn!, didSignInFor user: GIDGoogleUser!, withError error: Error!) каждый раз, когда вы перезапускаете приложение.

Вы можете просто сохранить данные пользователя, как только пользователь успешно войдет в систему с помощью Google, и вы можете получить accessToken с помощью

let accessToken = user.authentication.accessToken

, и вы можете сохранить его локально, как в UserDefault и в следующий раз. когда пользователь перезапустит приложение, вы можете легко определить его, обратившись к нему accessToken локально.

И с func sign(_ signIn: GIDSignIn!, didSignInFor user: GIDGoogleUser!, withError error: Error!) пользовательский параметр будет иметь пользовательские данные, когда пользователь попытался войти в систему. И может также сохранить эти данные локально.

А с выходом из системы вы можете просто удалить данные локально, так что когда пользователь перезапустит приложение, ему потребуется снова войти в систему.

Обновление:

Вы можете получить доступ к информации о пользователе с помощью свойства profile объекта user. проверьте ниже пример

print(user.profile.email)
print(user.profile.name)
print(user.profile.familyName)
print(user.profile.givenName)
print(user.profile.hasImage)
6
задан iDeveloper 5 April 2016 в 09:06
поделиться

4 ответа

Когда Вы звоните autorelease, Вы даете владение объекта к текущему пулу автовыпуска. Цикл выполнения создает новый пул автовыпуска, прежде чем он диспетчеризирует событие (такой как applicationDidFinishLaunching:) и уничтожает тот пул, когда событие заканчивается.

Когда Вы даете владение Вашего LoginViewController к пулу автовыпуска это выпущено сразу после applicationDidFinishLaunching: возвраты. Когда контроллер представления освобождает себя, он удаляет свое представление из суперпредставления (Ваше окно в этом случае).

Ваш делегат приложения должен сохранить владение LoginViewController и release это в делегате приложения dealloc метод (или когда Вы сделаны с Вашим входом в систему и шли дальше к другому представлению).

13
ответ дан 8 December 2019 в 13:49
поделиться

To expand on Don's answer, it may be somewhat confusing to say "you give ownership of the object to the current autorelease pool." This might be misunderstood to mean the object is guaranteed to be destroyed when the autorelease pool is drained. This is not correct (though it will happen in this case). Sending -autorelease requests that the autorelease pool send a -release message when it is drained. If that -release message makes retainCount = 0, then the object will be destroyed.

So, in order to do what Don is recommending, you need to create a ivar to keep track of this view controller. His explanation of why the view vanishes is exactly right; but you don't want to just leak the view controller. You want to hold onto it, and release it when you're done with it.

@interface ... {
   LoginViewController *_loginViewController;
}

@property (readwrite, retain) LoginViewController *loginViewController;

@implementation ...
@synthesize loginViewController = _loginViewController;

- (void)applicationDidFinishLaunching:(UIApplication *)application {

    self.loginViewController = [[[LoginViewController alloc] initWithNibName:@"LoginView" bundle:nil] autorelease];

    [window addSubview: [loginViewController view]];
    [window makeKeyAndVisible];
}

- (void)dealloc {
    [_loginViewController release]; _loginViewController = nil;
    [super dealloc];
}
4
ответ дан 8 December 2019 в 13:49
поделиться

Так как Вы добавляете Ваш LoginViewController к пулу автовыпуска это выпускается в конце цикла выполнения. Когда это происходит, это также выпускает представление it и удаляет его из того, чтобы быть отображенным.

0
ответ дан 8 December 2019 в 13:49
поделиться

autoreleasepool убран в конце runloop. Это означает, пока Вы вызываете методы и действительно наполняете, это все еще там.

Я не вижу ошибки в Вашем коде, но Окно сохраняется правильно в Вашем примере.

0
ответ дан 8 December 2019 в 13:49
поделиться