jer*_*cis 3 object objective-c nsobject
我知道id适用于任何Object类型,甚至是不继承NSObject的对象,例如Cocoa中的东西.我被告知几乎总是使用id但是如果我正在创建一个API并且有一个方法我想明确它应该只采用某种类型的对象这样一个名为Animal的对象,我还会使用
(id) animal
Run Code Online (Sandbox Code Playgroud)
或者我会这样做
(Animal) animal
Run Code Online (Sandbox Code Playgroud)
非常感谢!
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'
Run Code Online (Sandbox Code Playgroud)
如果你看看任何Cocoa或Cocoa Touch类,你会发现很多例子.我们来看一点UIView:
- (BOOL)isDescendantOfView:(UIView *)view; // returns YES for self.
- (UIView *)viewWithTag:(NSInteger)tag; // recursive search. includes self
Run Code Online (Sandbox Code Playgroud)
如您所见,第一种方法将a UIView*作为参数.如果你尝试传递指向实例的指针以外的东西UIView,编译器会抱怨.
第二种方法返回a UIView*,您可以直接将结果用作UIView理解的其他消息的接收者:
[[topView viewWithTag:someTag] removeFromSuperview];
Run Code Online (Sandbox Code Playgroud)
通过具体了解参数类型和返回值,编译器可以帮助您确保向对象发送适当的消息并获取适当的值.