代码之家  ›  专栏  ›  技术社区  ›  Nate

创建NSSavePanel后未调用NSString类别方法

  •  0
  • Nate  · 技术社区  · 11 年前

    我有 a simple Cocoa application (压缩39 KB),包含一个应用程序委托( AppDelegate )和一个 NSString 类别(以及一个不执行任何操作的默认窗口)。

    在其 init 方法 应用程序委派 创建 NSSavePanel 在执行此操作之前和之后,它记录由空格和换行符修剪的字符串的长度 NS字符串 分类方法: stringByTrimmingWhitespace .

    该字符串由空格和换行符组成。我的category方法应该修剪所有这些字符,得到一个0长度的字符串。

    NSSavePanel(NS保存面板) 已创建,我的 字符串(按修剪)空白 方法,并返回一个长度为0的字符串,正如预期的那样。在 NSSavePanel(NS保存面板) 已创建,我的 字符串(按修剪)空白 方法似乎并没有被调用,无论调用什么方法都不会修剪换行符。然而,一个不同的 NS字符串 做完全相同事情的类别方法 stringByTrimmingWhitespaceAndNewlines 被调用并按预期工作。

    我完全不知道是什么导致了我 字符串(按修剪)空白 不被调用,或者如何修复它(除了重命名它,我就是这么做的)。我还担心其他类上的其他类别方法可能会被破坏。有人知道这里发生了什么吗?

    1 回复  |  直到 11 年前
        1
  •  6
  •   user1059264 user1059264    11 年前

    看起来好像 NSSavePanel 正在NSString上加载一个类别以供自己使用,该方法的名称与 -[NSString(TurnerAdditions) stringByTrimmingWhitespace] 方法您可以使用此代码进行验证:

    NSString *foo = @"!";
    NSLog(@"Responds to '-stringByTrimmingWhitespace': %@", [foo respondsToSelector:@selector(stringByTrimmingWhitespace)] ? @"YES" : @"NO");
    NSSavePanel *panel = [NSSavePanel savePanel];
    NSLog(@"Responds to '-stringByTrimmingWhitespace': %@", [foo respondsToSelector:@selector(stringByTrimmingWhitespace)] ? @"YES" : @"NO");
    

    为什么它的行为与你的不同有些奇怪(编辑:不,不是,请参阅@rdelmar的评论)。

    你应该 总是 请在类别中的方法名称前面加上前缀,特别是对于这样的实例。Cocoa命名约定相当明确,这使得它很可能存在名称冲突。由于类别的处理方式(例如,它们可以在应用程序执行过程中加载,而您不知道),编译器很难/不可能提供冲突错误。