NSString 值不持久

NSString value not persistent

我在 "class.h":

中声明 class NSString 类型的变量
@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 的值?

尝试分配 appID 变量,如:[NSString string] in "class.m",然后您可以更改此变量的值。 您尝试将值赋给 null

你知道如何,当你赋值时,它只是保持原始对象的引用,但很快你用 new alloc 初始化新对象或调用保留,它是原始对象的副本。您可以保留或使用

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

或者您可以将 appId 定义为:

@property (strong, nonatomic) NSString *appId; 

在界面中,用self.appId引用。

So i got it to work by doing this: appId = [[dic objectForKey:@"appid"] retain];

如果编译成功,则意味着您已经为该文件或整个项目关闭了 ARC(自动引用计数)。现在几乎没有理由这样做,特别是如果您对手动引用计数规则不是很熟悉的话。最好的解决方案几乎肯定是重新打开 ARC 并删除 retain 调用。

So that means that the appId my assumption was correct and appId was referencing the "dic" object all this time? The question is how can i detach the appId from the "dic" object so it will stay alive even when the object is cleard?

基本上,您是在不保留字符串的情况下将字符串分配给 appId。当你从中得到它的字典被释放时,它也释放了它包含的所有对象,包括 appId 指向的字符串。使用您显然正在使用的手动引用计数,您必须 retain 您保留引用的任何对象,并且当您不再需要该引用时 release 这些对象。如果您使用 alloc/initnewcopy (或它们的某些变体)创建对象,则不需要 retain 该对象,但您确实需要 release 它。您可以在 Memory Management Rules.

中阅读更多相关信息