Objective-C id& NSObject的

时间:2014-02-24 20:50:57

标签: objective-c object nsobject

我知道id适用于任何Object类型,甚至是不继承NSObject的对象,例如Cocoa中的东西。我被告知几乎总是使用id,但是如果我正在制作一个API并且有一个方法我想明确表示它应该只采用某种类型的对象,例如一个名为Animal的对象,我还会使用

(id) animal

或者我会做什么

(Animal) animal

非常感谢!

2 个答案:

答案 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开始,然后通过继承链到NSObjectid的任何类型。任何都是有效的。但在大多数情况下,您只需使用Animal,因为这是您需要使用的类型