这些基本上是一回事吗?
例如,如果我有一个Java接口
public interface CoolObject{
...
}
我可以使用在CoolObject
作为参数的函数中实现CoolObject
接口的任何对象:
public void foo(CoolObject o) {
...
}
在Objective-C中是否相同?
@protocol CoolProtocol
...
@end
@interface Foo: NSObject <CoolProtocol>
...
@end
(void) - someMethod: (CoolProtocol *) obj {
}
上述工作(并被认为是正确的吗?)
感谢您的时间。如果您需要我澄清我的问题,请告诉我。
答案 0 :(得分:34)
关闭。在Objective C中,您指出一个对象实现了一个带有尖括号&lt;&gt;的协议,因此您可以像下列其中一个一样编写您的方法:
- (void) someMethod: (id <CoolProtocol>) obj { }
- (void) someMethod: (id <NSObject, CoolProtocol>) obj { }
- (void) someMethod: (NSObject <CoolProtocol> *) obj { }
在所有情况下,你都说someMethod需要一个实现CoolProtocol的对象。
id是指向任何类型的Objective C对象的通用指针。
所以id&lt; CoolProtocol&GT;表示“任何实现CoolProtocol的客观C对象”。
通常,您希望能够保留/释放/自动释放对象,并且通常将其视为常规Cocoa对象,因此通常也可以添加NSObject协议,这是第二种情况。
如果你想确保它实际上是一个合适的Cocoa对象(不包括基于NSProxy的对象),那么你可以使用最后一个表单,它基本上说“我想要任何实现CoolProtocol的真正Cocoa Objective C对象”。
答案 1 :(得分:14)
@protocol CoolProtocol <NSObject>
@end
这将减少您在方法声明中声明NSObject协议的需要。
- (void) someMethod: (id <NSObject, CoolProtocol>) obj { }
现在变成
- (void) someMethod: (id <CoolProtocol>) obj { }