我知道 id 适用于任何对象类型,甚至是不继承 NSObject 的对象,例如来自 Cocoa 的对象。我被告知几乎总是使用 id,但是如果我正在制作一个 API 并且有一个方法我想明确表示它应该只接受某种类型的对象,比如一个叫做 Animal 的对象,我还会使用吗
(id) animal
还是我会做
(Animal) animal
非常感谢!
最佳答案
id
是一个指向对象的通用指针——类似于 void *
,除了指针必须指向一个 Objective-C目的。所以是的,您可以在大多数更具体的对象指针类型可以工作的情况下使用 id
,但通常最好使用更具体的类型:
- (id)animal; // OK if 'animal' could be any type of object
- (Animal*)animal; // much better if you know that 'animal' points to an object of type 'Animal'
如果您查看任何 Cocoa 或 Cocoa Touch 类,您会发现大量示例。让我们看一点UIView
:
- (BOOL)isDescendantOfView:(UIView *)view; // returns YES for self.
- (UIView *)viewWithTag:(NSInteger)tag; // recursive search. includes self
如您所见,第一个方法将 UIView*
作为参数。如果您尝试传递指向 UIView
实例的指针以外的其他内容,编译器会报错。
第二个方法返回一个UIView*
,你可以直接使用这个结果作为UIView
理解的其他消息的接收者:
[[topView viewWithTag:someTag] removeFromSuperview];
具体说明参数类型和返回值可让编译器帮助您确保向对象发送适当的消息并获取适当的值。
关于Objective-C id 和 NSObject,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21998713/