Objective C NSString* свойство сохраняет причуду количества

Итак, мой вопрос: как открыть URL авторизации, не открывая браузер? Я хочу, чтобы мой код автоматически авторизовался, не делая этого вручную.

Если вы используете G Suite, вы можете создать учетную запись службы и активировать делегирование в рамках всего домена для принятия личности пользователя G Suite. Это работает только для пользователей, которые являются частью вашего домена G Suite.

Если вы не используете G Suite, вы не сможете обойти экран аутентификации пользователя при первом входе пользователя на ваш сайт. Как только пользователь аутентифицируется с доступом offline, вы можете сохранить токен обновления для использования в будущем.

Аутентификация и авторизация происходит между клиентом (пользователем) и аккаунтами Google. Ваше программное обеспечение не участвует в части учетных данных (имя пользователя, пароль и т. Д.). Пользователь должен предоставить разрешение на использование учетных записей Google, чтобы ваши службы могли получить доступ к идентификационной информации Google.

[EDIT 1/22/2019 - после вопроса о том, как сохранить токен обновления]

Следующий код с авторизацией и сохранением токена обновления:

# pip install google-auth-oauthlib
from google_auth_oauthlib.flow import InstalledAppFlow

# https://google-auth-oauthlib.readthedocs.io/en/latest/reference/google_auth_oauthlib.flow.html

flow = InstalledAppFlow.from_client_secrets_file(
    'client_secrets.json',
    scopes=['https://www.googleapis.com/auth/cloud-platform'])

cred = flow.run_local_server(
    host='localhost',
    port=8088,
    authorization_prompt_message='Please visit this URL: {url}',
    success_message='The auth flow is complete; you may close this window.',
    open_browser=True)

with open('refresh.token', 'w+') as f:
    f.write(cred._refresh_token)

print('Refresh Token:', cred._refresh_token)
print('Saved Refresh Token to file: refresh.token')
5
задан iDeveloper 4 April 2016 в 13:52
поделиться

9 ответов

У Вас есть ссылка на неизменную строку. Присвоение не должно копировать значение (строковые данные), так как это неизменно. Если Вы делаете изменяемую операцию, как значение = [newValue uppercaseString] затем она должна скопировать биты в значение, и значение сохраняет увеличенное количество.

3
ответ дан 18 December 2019 в 05:18
поделиться

Не смотрите на, сохраняют количества. Они не полезны и только введут в заблуждение Вас — Вы не можете быть уверены, что ничто иное не сохраняет объект, что объект, от которого Вы добираетесь где-нибудь, не совместно используется.

Вместо этого сконцентрируйтесь на монопольном использовании объекта и следуйте правилам управления памятью Какао к букве. Тем путем Ваше управление памятью будет корректно независимо от того, что Какао оптимизации может делать негласно для Вас. (Например, реализовывая -copy как просто -retain для неизменных объектов.)

Кроме того, очень важно понять различие между свойствами Ваших объектов и переменных экземпляра в Ваших объектах. В коде Вашего вопроса Вы присваиваете значение переменной экземпляра. Та переменная экземпляра просто что: переменная. Присвоение ему будет вести себя как любое другое переменное присвоение. Для использования свойства необходимо использовать или точечный синтаксис или синтаксис скобки для фактического вызова метода установщика свойства:

self.value = newValue;     // this is exactly equivalent to the next line
[self setValue:newValue];  // this is exactly equivalent to the previous line

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

21
ответ дан 18 December 2019 в 05:18
поделиться

Вы являетесь передающими в литеральной строке. Компилятор, вероятно, выделяет его в статическом ЗУ и устанавливает сохранить количество на максимальное возможное значение.

Попробуйте динамично выделенную строку вместо этого и посмотрите то, что происходит.

NSString* string = [[NSString alloc] initWithString: @"some text"];
Test* test = [[Test alloc] initWithValue: string];
11
ответ дан 18 December 2019 в 05:18
поделиться

Вы являетесь передающими в строковой константе, которая не может действительно быть освобождена. Я думаю, что 2147483647, вероятно, UINT_MAX, который в основном означает, что объект не может быть выпущен.

3
ответ дан 18 December 2019 в 05:18
поделиться

Я думаю, что Вы хотите сделать это:

self.value = newValue;

который вызовет метод set свойства и заставит копию происходить. "значение = newValue" просто присваивает значение указателя переменной экземпляра.

3
ответ дан 18 December 2019 в 05:18
поделиться

Вы не должны быть уделением внимания сохранить количествам, просто следовать правилам управления памятью Какао. http://iamleeg.blogspot.com/2008/12/cocoa-memory-management.html

2
ответ дан 18 December 2019 в 05:18
поделиться

хм.. мы становимся ближе.

кажется, что newValue's сохраняет количество, также 2147483647.

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

Я нашел полезную статью здесь: http://www.cocoadev.com/index.pl?NSString

FTA:

NSString, возвращенный"", должен быть выпущен, или он автовыпущен? Ни один. "" - строки имеют класс NSConstantString?, и таким образом действуйте как атомы в шепелявости; они бродят вокруг. Таким образом, если Вы будете использовать "корова" в двух отдельных местах в Вашем коде, то они будут ссылаться на тот же самый объект. Я не думаю - выпуск или-autorelease делают что-либо любому из них.

Если у меня есть "копия" на свойстве, хотя, разве это не должно копировать содержание целевой памяти в новую память с сохранить количеством 1? Казалось бы, что атрибут копии ничего не делает в этом случае?

0
ответ дан 18 December 2019 в 05:18
поделиться

В Какао многие неизменяемые объекты просто сохранят себя, когда вы запросите копию в той же зоне. Если гарантируется, что объект не изменится (то есть его неизменность), то точный дубликат является избыточным.

В Objective-C класс константной строки отделен от класса NSString Какао, хотя он может быть подкласс NSString (я не совсем уверен). Этот класс константной строки может переопределять методы NSObject , такие как keep , release и dealloc , чтобы они ничего не делали, а также переопределяли keepCount , чтобы он всегда возвращал одно и то же число, UINT_MAX или около того. Это связано с тем, что постоянная строка Objective-C создается в статической памяти.

0
ответ дан 18 December 2019 в 05:18
поделиться
#import <Foundation/Foundation.h>

int main (int argc, const char * argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    char *cstr = "this is a c string";

    NSString *str = [[NSString alloc] initWithUTF8String:cstr];
    NSLog(@"rc1: %d", [str retainCount]);

    [pool drain];
    return 0;
}

Если вы запустите приведенный выше код, он отобразит счетчик сохраненных данных, равный 1

0
ответ дан 18 December 2019 в 05:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: