NSString值不持久

时间:2018-11-19 10:02:23

标签: ios objective-c nsstring

我在“ class.h”中声明了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的值?

3 个答案:

答案 0 :(得分:0)

您知道如何做,请参见在分配值时仅保留原始对象的引用形式,但是很快您将使用new alloc初始化新对象或调用keep,它是原始对象的副本。您可以保留或使用

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

或者可以将appId定义为:

@property (strong, nonatomic) NSString *appId; 

在界面中,并用self.appId进行引用。

答案 1 :(得分:0)

  

因此,我通过执行以下操作使其工作:appId = [[dic objectForKey:@"appid"] retain];

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

  

这意味着我假设的appId是正确的,并且appId一直都在引用“ dic”对象?问题是如何将appId与“ dic”对象分离,以便即使清除该对象也能保持活动状态?

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

答案 2 :(得分:-2)

尝试分配appID变量,如:“ class.m”中的[NSString string],然后可以更改此变量的值。 您尝试将值分配为null