通常,当开发人员创建一个指向实现协议(protocol)的类实例的指针时,她会这样做:
id<ProtocolName> myInstance = [[SomeClass alloc] init];
可以更具体地了解实例的类类型并像这样使用它吗?
SomeClass<ProtocolName> *myInstance = [[SomeClass alloc] init];
或者在方法中:
- (SomeClass<ProtocolName> *)someMethodWithArg:(int)arg;
实现(假设 SomeSuperClass 是 SomeClass 的父类(super class)):
- (SomeClass<ProtocolName> *)someMethodWithArg:(int)arg
{
SomeClass<ProtocolName> *instance = [[SomeSuperClass alloc] init];
return instance;
}
最佳答案
是的,没问题。 (虽然我认为你的最后一个例子使用 SomeClass
,它应该使用 SomeSuperClass
,但我明白你的意思。)
事实上,有时您需要这样做。例如,使用autorelease
或release
在NSObject
上(这不适用于 id<ProtocolName>
(除非 ProtocolName
明确符合 NSObject
协议(protocol))),您必须使用:
NSObject<ProtocolName> *protoObj = [....];
[....]
[protoObj autorelease];
关于Objective-C:带有协议(protocol)的实例指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12624916/