我在“ 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
的值?
答案 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
/ init
或new
或copy
(或其中的一些变体)创建对象,则无需retain
,但您确实需要release
。您可以在Memory Management Rules中详细了解它。
答案 2 :(得分:-2)
尝试分配appID变量,如:“ class.m”中的[NSString string],然后可以更改此变量的值。 您尝试将值分配为null