【问题标题】:NSString value not persistentNSString 值不持久
【发布时间】:2019-04-21 16:04:49
【问题描述】:

我在“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 的值?

【问题讨论】:

  • 你能添加一些额外的代码
  • 检查此代码告诉我没有问题。搜索 appId 并检查它的值是否在其他地方更新,还显示代码是否显示为 appId 的值。
  • appId 是成员变量吗?如果是,您是否在同一个对象上调用函数 a 和 b?
  • @rptwsthi 是不是在清除 dic(字典)时清除了 app id 值?那么当 net 函数调用并且 dic 不再有效时 appId 值指向未填充的地址?
  • 请显示完整的定义。那个“类变量”是如何声明的?

标签: ios objective-c nsstring


【解决方案1】:

你知道怎么做,看到当你赋值时它只是保留原始对象的引用,但很快你用newalloc初始化新对象或调用retain,它是原始对象的副本。你可以保持保留或使用

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

或者您可以将appId 定义为:

@property (strong, nonatomic) NSString *appId; 

在界面中,通过self.appId引用它。

【讨论】:

    【解决方案2】:

    所以我这样做了:appId = [[dic objectForKey:@"appid"] retain];

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

    所以这意味着我的假设是正确的 appId 并且 appId 一直在引用“dic”对象?问题是我如何才能将 appId 从“dic”对象中分离出来,这样即使对象被清除,它也能保持活动状态?

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

    【讨论】:

    • 所以如果我分配/初始化变量我仍然需要释放它,所以它与保留完全一样
    • 是的,当你创建一个对象时,你需要释放它。如果你得到一个别人创建的对象,你需要保留它直到你完成它,然后释放它。但同样,你自己做这件事没有什么意义——编译器可以比你做得更好、更可靠,所以除非有真正的理由不这样做,否则只需打开 ARC 并让编译器为你处理。
    【解决方案3】:

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

    【讨论】:

    • 你不能改变你从[NSString string]得到的NSString的字符串——你只能用不同的字符串替换它。如果你只是要替换它,那么一开始就分配它是没有意义的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多