【问题标题】:Does a Category applied to NSString also apply to NSCFString via the "toll-free bridge"?应用于 NSString 的类别是否也通过“免费桥”应用于 NSCFString?
【发布时间】:2010-04-26 04:26:26
【问题描述】:

我们正在将一个库集成到一个 iPhone 应用程序中,该应用程序似乎在内部使用了适用于 iPhone 的谷歌工具箱。 google 工具箱在 NSString 中添加了一个方法gtm_stringBySanitizingAndEscapingForXML。 问题是,每当我们尝试调用这个库时,我们都会得到 ​​p>

[NSCFString gtm_stringBySanitizingAndEscapingForXML]: unrecognized selector sent to instance 0x272478

因此,库似乎在 NSCFString 上调用该方法,该类别不适用于该方法。 那么......是否该类别不适用于通过免费桥梁到 CoreFoundation 课程的情况? 如果是这样的话,那么我们至少知道它为什么会爆炸。弄清楚如何解决它是另一回事。

【问题讨论】:

    标签: iphone objective-c categories google-toolbox-for-mac


    【解决方案1】:

    应用于 NSString 的类别也适用于 NSCFString,因为 NSCFString 是 NSMutableString 的子类,而 NSMutableString 是 NSString 的子类。

    但是您是否真的包含了 Google 工具箱库 (GTMNSString+XML.m)?

    【讨论】:

    • 谷歌工具箱是内置在库中的,所以如果我们包含它,我们会因为类被重新定义而出错。我的同事实际上已经解决了这个问题,有一个链接器标志导致它中断。谢谢你的回答。
    【解决方案2】:

    NSCFString 类不是NSMutableString 的子类...它只是NSString 集群的另一个类。因此,如果您有一个 NSCFString foo var 并且您对此进行了测试:

    BOOL isNSString = [foo isKindObClass:[NSString class]];
    

    你会发现isNSStringNO

    我遇到了一些问题,因为我创建了一个 NSString 类别,但当该类是 NSCFString 或该集群中的任何其他类时,我不知道如何应用新方法...


    编辑: 好的,我找到了解决方案。虽然这些测试返回了NO:

    [myString isKindOfClass:[NSString class]];
    [myString respondsToSelector:@selector(myNSStringCategorySelector:)];
    

    我强制执行NSCFString 类的方法,它工作正常!!

    希望对大家有所帮助!

    【讨论】:

    • 强制执行如何?使用 performSelector?
    【解决方案3】:

    听起来这个类的实现没有链接到你的程序中。假设您的库被编译为静态库,您可能需要将 -ObjC 链接器标志添加到您的项目中。有关更多信息,请查看this technote。那里提到的链接器错误应该用最新的 Xcode 版本修复。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多