5

我习惯看到这样id<NSCopying> myVarMyObject<NSCopying> myVar,在那里我们指出问题的变量可以愉快地有NSCopying方法调用它没有编译器抛出一个不稳定的东西。什么定义为`类的可变<SomeProtocol> myClass`意思?

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

Class<NSCopying> myClass; 

我想知道这是什么,其实就是因为它似乎从上面两个例子稍有不同。我们似乎在说,变量myClass可以愉快地接受来自NSCopying的方法调用 - 但具有类的类型能够接受这些变量的方法似乎没有多大意义。

它发生,我认为类类型的变量在技术上是对象本身这可能是困惑我或编译器(可能是我!)。

所以我想我要问:

  1. 是什么像Class<NSCopying> myClass;实际上意味着
  2. 如何Class<NSCopying> myClass;不同的东西像id<NSCopying> myVar
  3. 哪里能像Class<NSCopying> myClass;有意义地使用?

注:

  • 我只是用NSCopying作为一个例子,是没有被整合到我的使用情况
  • 无论我指的Class我的意思是对象 - 关键字Class声明变量那些类型是Class。我不使用这个作为任何类类型的通用术语。

回答

0
id <NSCopying> myVar 

使用id可以提供任何类型的类的实例(只要它实现的协议,或者你投它使编译器信任你)。

Class <NSCopying> myClass 

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

说你想你的应用程序是可配置的。假设你有一些的,其提供了多种不同的功能类,但你不关心继承他们,就如何创建和配置它们。您可以使用该类必须符合的协议,并提供可以注册类的方法。然后,您可以使用定义的协议实例化这些类,而无需了解该类的其他任何信息。

+0

感谢您的回复。我可能不太清楚我使用“Class”这个词 - 请参阅我的编辑进行澄清。谢谢! – Barjavel

+0

“你只能提供一个类,而不是一个实例”那么,类对象*就是*对象,即实例。 – newacct

+0

@newacct,试图使用容易理解的术语。接受建议以改进描述。 – Wain

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 
+2

不,Objective-C对类对象没有类型安全性。您不能表达“NSString类型的类对象”或“符合协议X的类”。 –

0

Class<ProtocolName>是一个变量指向与符合ProtocolName的元类的类对象的类型。换句话说:该类实现ProtocolName类方法的方法。

示例:NSCopying含有一个要求的方法:

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

Class<NSCopying>意味着有在类中的方法

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

被指向。对于所有NSObject派生类都是如此,并且对于使用类对象作为字典键很有用。 See the documentation

+0

但是元类不能正式符合任何协议 – newacct

+0

@newacct当然,正确地说,谢谢你的明确!元类只通过实现协议中的方法而非正式地符合协议。 –