5

我习惯于看到诸如id<NSCopying> myVaror之类的东西MyObject<NSCopying> myVar,我们在其中声明所讨论的变量可以愉快地NSCopying调用它的方法,而编译器不会抛出一个不稳定的问题。

但我最近发现一些代码定义了一个像这样的变量:

Class<NSCopying> myClass;

我想知道这实际上意味着什么,因为它似乎与前两个示例略有不同。似乎我们在说变量myClass可以愉快地接受来自的方法调用NSCopying——但是让类类型能够接受这些实例变量方法似乎没有多大意义。

我突然想到,类类型的变量本身就是技术对象,这可能让我或编译器(可能是我!)感到困惑。

所以我想我在问:

  1. Class<NSCopying> myClass;类似的东西实际上是什么意思
  2. Class<NSCopying> myClass;与类似的东西有什么不同id<NSCopying> myVar
  3. Class<NSCopying> myClass;在哪里可以有意义地使用类似的东西?

笔记:

  • 我只是NSCopying作为一个例子使用,并不是我的用例不可或缺的
  • 无论我在哪里提到,Class我的意思是 Obj-C 关键字Class,用于声明类型为Class. 我没有将其用作任何类类型的通用术语。
4

3 回答 3

0
id <NSCopying> myVar

使用id您可以提供任何类型的类的实例(只要它实现了协议,或者您将其转换为使编译器信任您)。

Class <NSCopying> myClass

UsingClass意味着你只能提供一个Class,而不是一个实例。

假设您希望您的应用程序是可配置的。假设您有许多类,它们提供了许多不同的特性,但您并不关心它们具有的继承性,只关心如何创建和配置它们。您可以使用类必须遵守的协议并提供可以注册类的方法。然后,您可以使用定义的协议实例化这些类,而无需了解该类的任何其他信息。

于 2014-01-09T10:06:55.183 回答
0

Class<ProtocolName>是指向具有符合的元类的类对象的变量的类型ProtocolName。换句话说:类实现了ProtocolName方法中的方法

示例:NSCopying包含一种必需的方法:

@protocol NSCopying
- (id)copyWithZone:(NSZone *)zone;
@end

Class<NSCopying>表示有方法

+ (id)copyWithZone:(NSZone *)zone;

在指向的类中。对于所有NSObject派生类都是如此,并且对于将类对象用作字典键很有用。请参阅文档

于 2014-01-09T11:30:38.920 回答
0

好吧,我认为这可能意味着Class <NSCopying> myClass指向一个实现 NSCopying 协议的类。如果协议有类方法声明并且你想调用它们,它会很有用。

例如:

    @protocol NSSecureCoding <NSCoding>
       @required
       // The Secure Coding Guide should be consulted when writing methods that decode data.
       + (BOOL)supportsSecureCoding;
    @end
于 2014-01-09T10:41:21.317 回答