Значение NSString не является постоянным - PullRequest
0 голосов
/ 19 ноября 2018

Я объявляю переменную класса типа NSString в моем "class.h":

@interface class : NSObject<GADInterstitialDelegate, 
GADBannerViewDelegate, GADRewardBasedVideoAdDelegate, 
GADNativeAppInstallAdLoaderDelegate, GADNativeContentAdLoaderDelegate>
{
   ...
   NSString* appId;
}

Я файл "class.mm" В функции "a" я присваиваю значение переменной:

appId = [[dic objectForKey:@"appid"] stringValue]

Строковое значение в этой точке является правильным.

Проблема возникает, когда другой вызов функции - функция "b".

[GoogleMobileAdsMediationTestSuite presentWithAppID:appId onViewController:rootViewController delegate:nil];

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

Как я могу сохранить значение appId во всех будущих ссылках?

Ответы [ 3 ]

0 голосов
/ 19 ноября 2018

Вы знаете, как, когда вы присваиваете значение, вы просто сохраняете ссылку на исходный объект, но вскоре вы инициализируете новый объект с помощью new alloc или вызываете retain, это копия оригинала. Вы можете сохранить или использовать

NSString *entityName = [[NSString alloc] initWithString:[[dic objectForKey:@"appid"] stringValue]];` 

Или, может быть, вы можете определить appId как:

@property (strong, nonatomic) NSString *appId; 

в интерфейсе и, связать его с self.appId.

0 голосов
/ 19 ноября 2018

Итак, я заставил его работать следующим образом: appId = [[dic objectForKey:@"appid"] retain];

Если это скомпилировано, это означает, что вы отключили ARC (автоматический подсчет ссылок) для этого файла илидля всего вашего проекта.В наши дни нет особой причины делать это, особенно если вы не очень знакомы с правилами ручного подсчета ссылок.Лучшее решение почти наверняка состоит в том, чтобы снова включить ARC и удалить вызов retain.

Так что это означает, что appId мое предположение было правильным, и appId все время ссылался на объект "dic"?Вопрос в том, как я могу отсоединить appId от объекта "dic", чтобы он оставался в живых, даже когда объект очищен?

По сути, вы присваивали строку appId без сохранениястрока.Когда был выпущен словарь, из которого вы получили его, он также выпустил все содержащиеся в нем объекты, включая строку, на которую указывает appId.При ручном подсчете ссылок, который вы, очевидно, используете, вы должны retain любые объекты, на которые вы сохраняете ссылку, и release эти объекты, когда вам больше не нужна эта ссылка.Если вы создаете объект с alloc / init или new или copy (или каким-либо другим вариантом), вам не нужно retain этот объект, но вам нужно release его,Подробнее об этом вы можете прочитать в Правилах управления памятью .

0 голосов
/ 19 ноября 2018

Попробуйте выделить переменную appID, например: [NSString string] в "class.m", и затем вы можете изменить значение этой переменной. Вы пытаетесь присвоить значение null

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