2012-02-10 31 views
0

我的报告已经得到我的确认,其中一个应用程序的功能中的一个功能打破了10.7.3。经调查,似乎10.7.3在NSDictionary上引入了私人的-stringForKey:方法。Mac OS X 10.7.3增加 - [NSDictionary stringForKey:]方法?

[NSDictionary respondsToSelector:@selector(stringForKey:)]返回NO,正如人们所期望的那样。

但我对NSDictionary一类方法来实现-stringForKey:方法,如下所示(因此它可以被用于NSNumberNSDate值太)。在10.7.2及更早的版本中,它工作正常;在10.7.3下,它返回nil。直接获取对象和描述可以正常工作。所以它一定是一个类别冲突。

- (NSString *)stringForKey:(id)key; 
{ 
    return [[self objectForKey:key] description]; 
} 

我想这是有利于前缀类方法的另一种说法,尽管advice I got from an Apple Application Frameworks Evangelist

其他人能证实这一点吗?我认为这不是第三方应用程序冲突;我认为这是10.7.3的变化。

回答

2

您应该总是您在框架类上创建的前缀类别方法。毫无疑问。 10.7.3是否引入了这个方法并不重要,你没有使用前缀声明它是错误的。

顺便说一句,测试[NSDictionary respondsToSelector:@selector(stringForKey:)]不一定会工作。 NSDictionary是一个类集群,所以你只需要抽象超类,而私有方法只能存在于具体的子类中。

+0

好吧,由于苹果在前缀方面存在不一致的看法(请参阅我的链接帖子),但它并不十分清晰。 – Dejal 2012-02-10 23:52:47

+0

不过,关于类集群的好处。 – Dejal 2012-02-10 23:53:35

+1

@Dejal:“苹果”不是一个对所有东西都有一种意见的单一实体。只需查看各种示例代码中的样式混合。既然你没有发布你从传道者那里得到的实际回应,我无法分辨你对他所说的话的解释是否正确,但这并不重要。简单的事实是,你应该总是在框架类上声明前缀类别方法。没有理由不这样做,而且正如你发现的那样,有一个很大的理由要这样做。 – 2012-02-11 00:01:12