我知道id适用于任何Object类型,甚至是不继承NSObject的对象,例如Cocoa中的东西。我被告知几乎总是使用id,但是如果我正在制作一个API并且有一个方法我想明确表示它应该只采用某种类型的对象,例如一个名为Animal的对象,我还会使用
(id) animal
或者我会做什么
(Animal) animal
非常感谢!
答案 0 :(得分:6)
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];
通过具体了解参数类型和返回值,编译器可以帮助您确保向对象发送适当的消息并获取适当的值。
答案 1 :(得分:2)
您可以使用从Animal
开始,然后通过继承链到NSObject
和id
的任何类型。任何都是有效的。但在大多数情况下,您只需使用Animal
,因为这是您需要使用的类型