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
/init
或 new
或 copy
(或它们的某些变体)创建对象,则不需要 retain
该对象,但您确实需要 release
它。您可以在 Memory Management Rules.
中阅读更多相关信息
我在 "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
/init
或 new
或 copy
(或它们的某些变体)创建对象,则不需要 retain
该对象,但您确实需要 release
它。您可以在 Memory Management Rules.