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